C++ 删除结构c+的向量中的重复项+;

C++ 删除结构c+的向量中的重复项+;,c++,vector,structure,unique,duplicate-removal,C++,Vector,Structure,Unique,Duplicate Removal,我有以下结构。我想把结构存储在向量中。其次,我想删除(context)上的重复值。我做错了什么 #包括 #包括 #包括 使用名称空间std; //结构 结构上下文元素 { 字符串上下文; 浮动x; }; int main() { 向量v1; v1.推回({“1”,1.0}); v1.推回({“2”,2.0}); v1.推回({“1”,1.0}); v1.推回({“1”,1.0}); //这里出错 auto comp=[](const-contextElement&lhs,const-conte

我有以下结构。我想把结构存储在向量中。其次,我想删除(
context
)上的重复值。我做错了什么


#包括
#包括
#包括
使用名称空间std;
//结构
结构上下文元素
{
字符串上下文;
浮动x;
};
int main()
{
向量v1;
v1.推回({“1”,1.0});
v1.推回({“2”,2.0});
v1.推回({“1”,1.0});
v1.推回({“1”,1.0});
//这里出错
auto comp=[](const-contextElement&lhs,const-contextElement&rhs){返回lhs.context==rhs.context;};
//删除具有相同上下文的元素
擦除(std::unique(v1.begin(),v1.end(),comp));
对于(size_t i=0;icout
vector::erase()
不接受谓词。而
std::unique
的谓词应检查是否相等。

不要将
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;
    });
排序(v1.begin(),v1.end(), [](常量contextElement和lhs、常量contextElement和rhs){ 返回lhs.context
auto comp=[](const-contextElement&lhs,const-contextElement&rhs){返回lhs.context==rhs.context;};
auto pred=[](const-contextElement&lhs,const-contextElement&rhs){返回lhs.context
使用同一个比较器就可以了。虽然为什么小于和不==让我很困惑。@MadScienceDreams哦,你说得对。我还以为是的sorting@MadScienceDreams“==”即使只是将comp添加到UniqueJust也无济于事作为警告,对于缺少LH和RH相等运算符重载的数据结构,这类问题的常见解决方案将是有问题的。基本上,它抱怨它无法将
a
B
进行比较。我在使用旧的WinAPI结构时遇到了这个问题。哦,我应该对它进行排序吗e值?在应用unique之前???@HaniGoc:
unique
仅删除连续的重复项。如果要移动所有重复项,请先对其排序,或者执行更复杂的操作。啊,是的@MikeSeymour我必须对其排序first@MikeSeymour最后我将有两个值“1”和“2”@ HaniGoc,您也可以考虑使用<代码> STD::SET (O(NLGN))或<代码> STD::unOrdEdEdSet < /Cal>(O(n),但对于小集来说开销更高)是谓词lambda函数吗?@ HANICOC:“谓词”是任何函数(或函数对象)。它执行一个测试并返回
bool
。在这种情况下,它是您的lambda。不一定是提供满足所需测试的任何函数(或函子)(例如,对于
unique
,它是两个元素是否相等。)这也可以通过一个简单的函数来实现,它不必是lambda,只是后者更方便。。
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;
    });
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());