3

<(より小さい)コンパレータをオーバーロードして整数のペアのセットに渡すにはどうすればよいですか?これは私の現在のコードです:

class A{
public:
    typedef std::pair<int, int> pair_type;  

    bool operator<(const pair_type& a, const pair_type& b){ 
        if (a.first < b.first) return true;
        else if ( (a.first == b.first) && (a.second < b.second) ) return true;
        else return false;
    }

private:
    std::set< pair_type > edge_;
};

このコードをコンパイルしようとすると、次のエラーが発生します。

error: 'bool A::operator<(const pair_type&, const pair_type&)' must take exactly one argument

どうすれば修正できますか?

4

4 に答える 4

6
class A{
public:
    typedef std::pair<int, int> pair_type;  

    struct compare {
        bool operator()(const pair_type& a, const pair_type& b) {
          if (a.first < b.first) return true;
          else if ( (a.first == b.first) && (a.second < b.second) ) return true;
          else return false;
        }   
    };

  private:
    std::set<pair_type, compare> edge_;
};
于 2013-03-02T18:20:45.003 に答える
5

演算子のオーバーロードをクラスメンバーとして定義する必要があります(単一のパラメーター、通常は同じクラスの別のインスタンスを使用)。

class pair_type : public std::pair<int, int>
{
public:
    bool operator<(const pair_type &comp) const
    {
        if (this->first < comp.first) return true;
        else if ( (this->first == comp.first) && (this->second < comp.second) ) return true;
        else return false;
    }
};
于 2013-02-28T06:15:34.733 に答える
2

演算子はAクラスとは関係がないため、(メンバー関数ではなく)自由関数である必要があります。

于 2013-02-28T06:11:13.563 に答える
2

C ++ 11以降、コンパレータ構造体を定義する代わりにラムダ式を使用することもできます。

using pair_type = std::pair<int, int>;

auto comp = [](const pair_type& a, const pair_type& b) {
    return (a.first < b.first) || ((a.first == b.first) && (a.second < b.second));
};

また、2行を節約するために、コンパレータコードを圧縮しました。これで、次の方法でセットを定義できます。

std::set<pair_type, decltype(comp)> edge_(comp);

ただし、クラスメンバーであるセットに上記のコンパレーターを使用する場合は、上記のように、セットのコンストラクターにもコンパレーターを渡す必要があるため、少し快適ではありません。つまり、コンストラクター定義の初期化子リストでコンパレーターを渡す必要があります。

class A{
public:
    A() : edge_(comp) {}

private:
    std::set<pair_type, decltype(comp)> edge_;
};

Ideoneのコード

于 2018-06-06T19:27:58.783 に答える