C++ STL集合未按预期排序
我有一个类,它包含成员C++ STL集合未按预期排序,c++,stl,C++,Stl,我有一个类,它包含成员a、B和C,我希望这个类的对象存储在集合中,其中ABC三元组是唯一的,应该是set键。但是,集合排序结果并不像预期的那样 我的比较函子是: class MyClassLess { public: bool operator() (const MyClass& t1, const MyClass& t2) const { if(t1.getA() < t2.getA()) return true; if(t
a
、B
和C
,我希望这个类的对象存储在集合中,其中ABC三元组是唯一的,应该是set键。但是,集合排序结果并不像预期的那样
我的比较函子是:
class MyClassLess {
public:
bool operator() (const MyClass& t1, const MyClass& t2) const {
if(t1.getA() < t2.getA())
return true;
if(t1.getB() < t2.getB())
return true;
return t1.getC() < t2.getC();
}
};
typedef set<MyClass, MyClassLess> SetMyClass;
class MyClassLess{
公众:
布尔运算符()(常量MyClass和t1,常量MyClass和t2)常量{
if(t1.getA()
我希望集合中的元素首先按A
排序,然后按B
排序,最后按C
排序。但是,如果我从begin
到end
遍历集合,排序顺序将是:
B
C
A
换句话说,我得到一组成员,所有成员都有一个特定值B
,在该组中我看到C
的所有值,对于C
的每个值,我得到a
的所有值
你知道这是怎么回事吗?你的比较函数错了。以下是一个应该有效的版本:
class MyClassLess {
public:
bool operator()(const MyClass& t1, const MyClass& t2) const {
if(t1.getA() < t2.getA())
return true;
if(t1.getA() > t2.getA())
return false;
if(t1.getB() < t2.getB())
return true;
if(t1.getB() > t2.getB())
return false;
return t1.getC() < t2.getC();
}
};
class MyClassLess{
公众:
布尔运算符()(常量MyClass和t1,常量MyClass和t2)常量{
if(t1.getA()t2.getA())
返回false;
if(t1.getB()t2.getB())
返回false;
返回t1.getC()
当左侧的A
或B
小于右侧的相应成员时,算法需要返回false
如果您只想正确实现值元组的比较,只需使用标准库元组的比较。您可以使用std::tie
创建引用的元组,因此您的比较器只是:
#include <tuple>
// ...
bool operator() (const MyClass& t1, const MyClass& t2) const
{
return std::tie(t1.getA(), t1.getB(), t1.getC())
< std::tie(t2.getA(), t2.getB(), t2.getC());
}
#包括
// ...
布尔运算符()(常量MyClass和t1,常量MyClass和t2)常量
{
返回std::tie(t1.getA(),t1.getB(),t1.getC())
但是,您仍然必须确保比较一组值实际上意味着什么。(提示:想想字典吧)停止使用电脑。拿出一支笔和一张纸,详细计算你的“排序”是否有意义。也许std::tie(t1.getA(),t1.getB(),t1.getC())
?好的,完成:-)我仍然希望真正的信息是,在开始编写代码之前理解数学很重要…@Kerrek:done。不过,您要回答的是,您需要知道正确的std库特性,并且忘记数学。(并不是说我会看不起它。如果你使用std-lib算法而不是编写自己的算法,你就不能把bug放进去。)