Удалить повторяющиеся записи в векторе C ++

Просто хочу удалить дубликаты. Бассейн vector<pair<string, int>> но я как-то скучаю по некоторым элементам в начале вектора. Кто-нибудь может проверить логику удаления? Спасибо 🙂

Pool Master::eliminateDuplicates(Pool generation)
{
for(int i = 0; i < generation.size(); i++)
{
string current = generation.at(i).first;

for(int j = i; j < generation.size(); j++)
{
if(j == i)
{
continue;
}
else
{
string temp = generation.at(j).first;
if(current.compare(temp) == 0)
{
Pool::iterator iter = generation.begin() + j;
generation.erase(iter);
}
}
}
}

return generation;
}

7

Решение

Это очень распространенная проблема.

Потому что после удаления элемента указанная позиция j пропустит один элемент из-за j ++ в цикле for.
самое простое решение для решения проблемы на основе вашего кода — добавить j— after generation.erase (iter):

  generation.erase(iter);
j--;
4

Другие решения

Если вы не возражаете против сортировки вектора, вы можете использовать std::unique. Это было бы O (Nlog (N))

#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());
auto last = std::unique(v.begin(), v.end());
v.erase(last, v.end());
for (const auto& i : v)
std::cout << i << " ";
std::cout << "\n";
}
19

По вопросам рекламы [email protected]