Удалить дубликаты в векторе структуры Stack Overflow

У меня есть следующая структура. Я хочу сохранить структуру в векторе. Во-вторых, я хочу удалить повторяющиеся значения на (context). Что я делаю неправильно?


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//Structure
struct contextElement
{
string context;
float x;
};

int main()
{
vector<contextElement> v1;
v1.push_back({"1",1.0});
v1.push_back({"2",2.0});
v1.push_back({"1",1.0});
v1.push_back({"1",1.0});
//ERROR here
auto comp = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context == rhs.context;};
//Remove elements that have the same context
v1.erase(std::unique(v1.begin(), v1.end(),comp));
for(size_t i = 0; i < v1.size();i++)
{
cout << v1[i].context <<"  ";
}
cout << endl;
return 0;
}

Ошибка:

main.cpp | 23 | ошибка: нет соответствующей функции для вызова
‘std :: vector :: erase (__ gnu_cxx :: __ normal_iterator>, std :: vector :: iterator,
Основной () :: __ lambda0&) ‘|


возможное решение

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//Structure
struct contextElement
{
string context;
float x;
};

int main()
{
vector<contextElement> v1;
v1.push_back({"1",1.0});
v1.push_back({"2",2.0});
v1.push_back({"1",1.0});
v1.push_back({"1",1.0});
//sort elements@HaniGoc: unique only removes consecutive duplicates. If you want to move all //duplicates, then either sort it first, or do something more complicated. –  Mike Seymour
auto comp = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context < rhs.context;};
sort(v1.begin(), v1.end(),comp);

auto comp1 = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context == rhs.context;};
auto last = std::unique(v1.begin(), v1.end(),comp1);
v1.erase(last, v1.end());

for(size_t i = 0; i < v1.size();i++)
{
cout << v1[i].context <<"  ";
}
return 0;
}

2

Решение

vector::erase() не принимает предикат. И ваш предикат std::unique следует проверить на равенство.

5

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

auto comp = [] ( const contextElement& lhs, const contextElement& rhs ) {return lhs.context == rhs.context;};
auto pred = []( const contextElement& lhs, const contextElement& rhs ) {return lhs.context < rhs.context;}
std::sort(v.begin(),v.end(),pred);
auto last = std::unique(v.begin(), v.end(),comp);
v.erase(last, v.end());
3

Не проходи comp в erase; это просто занимает диапазон итератора.

v1.erase(std::unique(v1.begin(), v1.end(), comp), v1.end());

Обратите внимание, что это только удаляет последовательный дубликаты. Если вы хотите удалить все дублирует, и не против изменения порядка, затем сортируйте сначала:

std::sort(v1.begin(), v1.end(),
[] ( const contextElement& lhs, const contextElement& rhs ) {
return lhs.context < rhs.context;
});
2
По вопросам рекламы [email protected]