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::equal_range を std::lower_bound に置き換えると機能しますが、理由がわかりません。

4

1 に答える 1

3

equal_rangeは、値が等しいかどうかを判断するために、両方の方法で値を比較する必要があります

値、、は、次の場合aに別の値、、と同等であると見なされます。b(!(a<b) && !(b<a))

lower_boundは、範囲の一方の端を見つける必要があります。

比較は、に対してのみ機能しFoo < T、に対しては機能しませんT < Foo

于 2012-05-16T11:47:21.023 に答える