2

我有一个类定义了与其他类型的严格弱排序,我想在该类的容器上使用基于比较的算法(例如 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 是可行的,但我不知道为什么。

4

1 回答 1

3

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

一个值 ,a被认为与另一个值 , 等价b(!(a<b) && !(b<a))

lower_bound 只需找到范围的一端。

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

于 2012-05-16T11:47:21.023 回答