Сначала вы передаете std::vector
по значению, а не по ссылке. Поэтому любые изменения, сделанные вами в функции vectorremove
, не будут видны в main
. Кроме того, std::vector::erase
может сделать недействительными итераторы, поэтому вы не должны использовать его внутри l oop.
Ваш код может выглядеть следующим образом:
void vectorremove(std::vector<std::string>& v) {
auto end{ v.end() };
for (auto it = v.begin(); it != end; ++it)
{
end = std::remove(it + 1, end, *it);
}
v.erase(end, v.end());
}
Обратите внимание на использование авто вместо std::vector<std::string>::iterator
.
Однако STL предоставляет удобные функции для достижения того, что вы хотите. Одним из них является std::unique
, который
Исключает все элементы, кроме первого, из каждой последовательной группы эквивалентных элементов из диапазона [first, last) и возвращает past-the конец итератора для нового логического конца диапазона.
Чтобы удалить дубликаты из std::vector
, вы можете сделать что-то вроде:
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v{ 1, 2, 3, 1, 2, 3, 3, 4, 5, 4, 5, 6, 7 };
std::sort(v.begin(), v.end()); // 1 1 2 2 3 3 3 4 4 5 5 6 7
auto last = std::unique(v.begin(), v.end());
v.erase(last, v.end());
for (auto const i : v) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
Помните, что std::unique
работает как положено только для отсортированных std::vector
с.