STL 集未按预期排序
STL set not sorted as expected
我有一个包含成员A
、B
和C
的类,我希望这个类的对象存储在一个set
中,其中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;
我希望集合中的元素首先按A
排序,然后按B
排序,最后按C
排序。但是,如果我从 begin
遍历集合到 end
,排序顺序为:
- 乙
- C
- 一个
换句话说,我得到一组成员,它们都有一个特定的值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();
}
};
您的算法需要返回false
左侧A
或B
小于右侧相应成员的时刻。
如果您只想正确实现值元组的比较,只需使用标准库元组的比较。您可以使用 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());
}
但是,您仍然必须确保比较值元组的实际含义。(提示:想想"字典"。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL - C++中按成绩对学生列表进行排序?
- C++ STL 排序会检查 NaN 吗?
- 使用列表 STL 递归进行插入排序
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 使用STL对用户输入数组进行排序的错误有什么解决方案吗?
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- C++ wrt 字符串中的 STL 排序函数
- 如何检查队列是否使用 STL 排序
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- C :STL STL阵列的STL排序
- STL 排序,保留原始顺序
- 列表STL的时间复杂性在一段时间内进行排序
- 为 STL 列表编写选择排序
- c ++ 是否有 STL 算法来检查范围是否严格排序
- 对 STL 容器进行排序
- 使用 stl::map 和 stl::unordered_map 对包含大量重复元素的数组数据进行排序
- 使用另一个stl向量重新排序stl向量
- 在两个值上排序STL向量
- 排序STL列表的子类