Для этого можно использовать комбинацию алгоритмов std::sort
и std::unique
:
std::sort(elems.begin(), elems.end()); // Now in sorted order.
iterator itr = std::unique(elems.begin(), elems.end()); // Duplicates overwritten
elems.erase(itr, elems.end()); // Space reclaimed
Если вы работаете с необработанным массивом (скажем, не std::vector
), то вы не сможете восстановить пространство без копирования элементов в новый диапазон. Однако, если вы в порядке, начиная с необработанного массива и заканчивая чем-то вроде std::vector
или std::deque
, вы можете использовать unique_copy
и адаптер итератора для копирования только уникальных элементов:
std::sort(array, array + size); // Now in sorted order
std::vector<T> uniqueElements;
std::unique_copy(array, array + size,
back_inserter(uniqueElements)); // Append unique elements
На данный момент uniqueElements
теперь содержит все уникальные элементы.
Наконец, для более непосредственного решения вашего первоначального вопроса: если вы хотите сделать это на месте, вы можете получить ответ, используя возвращаемое значение из unique
, чтобы определить, сколько осталось элементов:
std::sort(elems, elems + N); // Now in sorted order.
T* endpoint = std::unique(elems, elems + N);// Duplicates overwritten
ptrdiff_t M = endpoint - elems; // Find number of elements left
Надеюсь, это поможет!