stl - 使用自定义比较器设置的 C++ STL
问题描述
对于 C++ STL set
,我需要自定义比较,但我的代码存在严重问题。使用 Visual Studio 2019 编译失败。第一个错误是(在 xutility 中)“错误 C2672:'operator __surrogate_func':找不到匹配的重载函数”。
这是代码:
#include <set>
struct P
{
char a;
char b;
char c;
};
class PSortingCriterion
{
public:
bool operator() (const P &p1, const P &p2) const
{
if(p1.a != p2.a)
return p1.a < p2.a;
else if(p1.b != p2.b)
return p1.b < p2.b;
else if(p1.c != p2.c)
return p1.c < p2.c;
else
return false; // p1 == p2
}
};
std::set<P, PSortingCriterion> s1, s2, diff;
void F(void)
{
if(s1 != s2) // errors are all due to this statement; no errors if it's removed
{
}
}
更新:按照 Igor Tandetnik 的建议,我修改了代码,但仍然无法编译(与上述相同的错误)。
新代码:
#include <set>
#include <algorithm>
#include <iterator>
struct P
{
char a;
char b;
char c;
};
class PSortingCriterion
{
public:
bool operator() (const P &p1, const P &p2) const
{
if(p1.a != p2.a)
return p1.a < p2.a;
else if(p1.b != p2.b)
return p1.b < p2.b;
else if(p1.c != p2.c)
return p1.c < p2.c;
else
return false; // p1 == p2
}
};
std::set<P, PSortingCriterion> s1, s2, diff;
void F(void)
{
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(diff, diff.begin()));
}
解决方案
要比较两个集合,您需要比较元素。请参阅Cpp参考。但是您没有提供任何方法来比较两个类型P
的对象是否相等。
如果您添加:
bool operator== (const P& p1, const P& p2) {
return p1.a == p2.a && p1.b == p2.b && p1.c == p2.c;
}
然后你的代码将编译。