Согласно документации std::unique
it
[e] ограничивает все элементы, кроме первого, из каждой последовательной группы эквивалентных элементов
(акцент мой).
Таким образом, он не удаляет все повторяющиеся значения, только те, которые находятся рядом, сокращая, например, [1 2 2 3 3 3 1 1 3 3 2 2]
до [1 2 3 1 3 2]
.
Если вы хотите сохранить только уникальные элементы в целомВы должны сначала отсортировать вектор:
std::sort(vecUniqueInputValues.begin(), vecUniqueInputValues.end());
// Vector is now [1, 1, 2, 2, .., 2, 4, .., 4, 5, ... ]
std::unique (vecUniqueInputValues.begin(), vecUniqueInputValues.end(),
uniqueCompressVectorCompareFunction);
Некоторые второстепенные точки
Функция сравнения выглядит несколько избыточной - если вы не укажете ее
[e] элементы сравниваются с использованием operator==
.
Также обратите внимание, что std::unique
действительно только перетасовывает элементы вокруг, так что все уникальные последовательные элементы находятся в начале вектора - вы по-прежнемупосмотрите значение 4
дважды в конце вашего вывода.Вы должны получить результат std::unique
- это итератор, указывающий на конец уникального диапазона:
auto endOfUniqueRange = std::unique(...);
std::cout << "compressInputData unique values sorted: " << std::endl;
for(auto& uiIt = vecUniqueInputValues.cbegin(); uiIt != endOfUniqueRange ; ++uiIt) {
std::cout << *uiIt << " ";
}
std::cout << std::endl;
На самом деле, я рекомендую использовать итераторы и циклы на основе диапазона в любом случае: вместо
for(auto i = 0; i < myVec.size(); ++i) {
// Do something with myVec[i]
}
запись
for(auto it = myVec.cbegin(); it != myVec.cend(); ++it) {
// Do something with *it
}
или, для итерации всего вектора,
for(unsigned int val : myVec) {
// Do something with val
}