stl 算法中不同类型的严格弱排序

Strict weak ordering of different types in stl algorithms

本文关键字:排序 同类型 算法 stl      更新时间:2023-10-16

我有一个类定义了与其他类型的严格弱排序,我想在该类的容器上使用基于比较的算法(例如 std::upper_bound(。

该标准定义容器的前向迭代器值类型应为类似类型的类型,因此以下内容不编译:

template<typename T>
class Foo {
public:
    bool operator<(const T& _val) { return val < _val; }
    //operator T() { return val; } // uncommenting this solves the problem
private:
    T val;
};
void bar() {
    vector<Foo<int>> foos(10);
    auto i_lb = std::lower_bound(foos.begin(), foos.end(), 17); // compiles and works, though I don't know why
    auto i_eq = std::equal_range(foos.begin(), foos.end(), 17); // error! not convertible to int
}

我找不到使用接受谓词的算法版本的方法(也要求类型相同(。定义转换运算符使此示例有效,但定义转换运算符并不总是正确的。使这种比较起作用的正确方法是什么?

顺便说一下,用std::lower_bound替换std::equal_range是有效的,但我无法弄清楚为什么。

equal_range必须以两种方式比较值以确定它们是否相等

(!(a<b) && !(b<a))时,一个值a被视为等价于另一个值b

lower_bound只需要找到范围的一端。

您的比较仅适用于Foo < T,而不适用于T < Foo.