【发布时间】:2014-11-06 19:43:32
【问题描述】:
我有以下结构。我想将结构存储在向量中。其次,我想删除 (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|error: 没有匹配的调用函数 'std::vector::erase(__gnu_cxx::__normal_iterator >, std::vector::iterator, main()::__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;
}
【问题讨论】:
-
只需使用en.cppreference.com/w/cpp/algorithm/unique,具有相同的比较器。虽然为什么它小于而不是 == 让我感到困惑。
-
@MadScienceDreams 哦,你是对的。我还以为是排序呢
-
@MadScienceDreams "==" 即使只将 comp 添加到 Unique 也无济于事
-
作为警告,此类问题的常见解决方案对于缺少 LH 和 RH 相等运算符重载的数据结构将是有问题的。基本上,它抱怨它无法将
A与B进行比较。我在使用旧的 WinAPI stuct 时遇到了这个问题。
标签: c++ vector structure unique duplicate-removal