Поскольку вы используете std::vector
, я предполагаю, что вы хотите максимизировать все его преимущества, включая reference locality. Для этого нам нужно немного ввести текст. И я протестированные ниже код ...
У меня есть линейный O(n)
алгоритм здесь (эффективно O(nlog(n))
), его немного, как ответ Брайена, но я использую OutputIterators вместо того, чтобы делать это на месте. Предварительное условие состоит в том, что оно сортируется.
template<typename InputIterator, typename OutputIterator>
OutputIterator single_unique_copy(InputIterator first, InputIterator last, OutputIterator result){
auto previous = first;
if(previous == last || ++first == last) return result;
while(true){
if(*first == *previous)
while((++first != last) && (*first == *previous));
else
*(result++) = *previous;
if(first == last) break;
previous = first;
++first;
}
return ++result;
}
А вот использование пример:
int main(){
std::vector<int> vm = {0, 1, 2, 0, 2, 1, 0, 0, 1, 88, 220, 0, 1, 2, 227, -8};
std::vector<int> kk;
std::sort(vm.begin(), vm.end());
single_unique_copy(vm.begin(), vm.end(), std::back_inserter(kk));
for(auto x : kk) std::cout << x << ' ';
return 0;
}
Как и следовало ожидать, выход:
-8, 88, 220, 227
Ваш случай использования может отличаться от моего, поэтому профиль сначала ... :-)
EDIT:
- Используя алгоритм luk32 и моя ... Использование 13 миллионов элементов ... , созданные в порядке убывания, повторяющиеся на каждом
i % 5
.
- Под отладочных, luk32:
9.34
секунд и мое: 7.80
секунды
- Под -O3, luk32:
2.71
секунд и мой 0.52
секунд
- Mingw5.1 64bit, Windows 10, 1,73 Core i5 4210U, 6GB DDR3 1600MHz RAM
- Benchmark здесь, http://coliru.stacked-crooked.com/a/187e5e3841439742
Для небольших чисел, разница остается в силе, пока она не станет некритическим кодом
Я бы начал с сортировки, после этого это должно быть легко. – tkausl
... и если вектор должен быть постоянным и не может быть отсортирован, скопируйте его на второй вектор, а затем отсортируйте. –
Я знаю, что это не совсем то, что вы просите, но это заставило меня задуматься о конвейерах C# linq - вот его версия C++ http://pfultz2.github.io/Linq/ - и многие другие (спросите у Google) – pm100