6

次のコードを修正する最もエレガントな方法は次のとおりです。

#include <vector>
#include <map>
#include <set>
using namespace std;

typedef map< int, int > row_t;
typedef vector< row_t > board_t;
typedef row_t::iterator area_t;

bool operator< ( area_t const& a, area_t const& b ) {
    return( a->first < b->first );
};

int main( int argc, char* argv[] )
{
    int row_num;
    area_t it;

    set< pair< int, area_t > > queue;
    queue.insert( make_pair( row_num, it ) ); // does not compile
};

それを修正する 1 つの方法は、less< の定義を名前空間 std に移動することです (私は知って  いますが、そうすることは想定されていません。 )

namespace std {
    bool operator< ( area_t const& a, area_t const& b ) {
        return( a->first < b->first );
    };
};

別の明白な解決策は、ペア < int、area_t > に対して less than< を定義することですが、それを避けて、定義されていないペアの 1 つの要素に対してのみ演算子を定義できるようにしたいと考えています。

4

1 に答える 1

7

特定のおよび/またはかなり風変わりな比較アプローチを実装するコンパレータを実装する場合、operator <その目的で をハイジャックするのではなく、名前付き関数または関数オブジェクトを使用することをお勧めします。std::pairオブジェクトを比較する自然な方法は、辞書式比較を使用することだと思います。あなたの比較は辞書編集的ではないので、引き継ぐoperator <のは良い考えではないかもしれません. 比較クラスをより適切に実装する

typedef pair< int, area_t > Pair; // give it a more meaningful name

struct CompareFirstThroughSecond {
  bool operator ()(const Pair& p1, const Pair& p2) const { 
    if (p1.first != p2.first) return p1.first < p2.first;
    return p1.second->first < p2.second->first;
  }
};

コンテナで使用します

std::set< Pair, CompareFirstThroughSecond > queue;  

(元のコードからあなたの意図を正しく解読したことを願っています)。

operator ()上記のメソッドをテンプレート メソッドとして実装することもできるため、メンバーstd::pairとして反復子を持つすべてのベース型で使用できます。secondただし、比較は十分に「エキゾチック」であるため、あまり意味がないかもしれません。

于 2010-02-24T19:50:52.407 に答える