-3

クラスの演算子をオーバーロードしようとし<、次のように関数を呼び出しました。

bool Edge::operator<(Edge const & e) const {
    return this->GetCost() < e.GetCost();
}

メイン()で

sort(edge_set.begin(),edge_set.end());

さらに、main.cpp で定義されたオブジェクトの単純な比較関数を作成して を呼び出そうとしましたがsort()、再び失敗しました。

bool edge_comparator(Edge& e1, Edge& e2){
    return (e1.GetCost() < e2.GetCost());
}

メイン()で

sort(edge_set.begin(),edge_set.end(), edge_comparator);

私が試したものに対してコンパイルエラーが発生します。ここで何が間違っていますか?オブジェクトのセットを並べ替えるにはどうすればよいですか?

4

2 に答える 2

3

std::setはソートされた連想コンテナであるため、再ソートできません。ソート基準は、構築時と要素挿入時に適用されます。

編集:一連のEdgeポインターがあります。これを独自の基準に従ってソートする場合は、2 番目のテンプレート引数としてstd::set、ポインターのペア間でより小さい比較を実行するファンクターの型で をインスタンス化できます。Edge

struct EdgePtrCmp
{
  bool operator()(const Edge* lhs, const Edge* rhs) const
  {
    return lhs->GetCost() < rhs->GetCost();
  }
}

それから

std::set<Edge*, EdgePtrCmp> s;

編集2:質問が再び変更されたため、一連のポインターを処理するかどうかは明確ではありません。

于 2013-04-10T12:35:59.073 に答える
1

2 つの問題。まず、セットの要素を並べ替えることができません。それらの順序基準は構築時に決定され、オブジェクトの基本的な部分です。これは、 の約束の一部である O(log n) ルックアップ、挿入、および削除を達成するために必要ですstd::set。デフォルトでは、 を使用しstd::less<Edge>、 を呼び出す必要がありますoperator<edge_comparatorただし、次のように関数を使用することもできます。

std::set<Edge, bool(*)(Edge&,Edge&)> edge_set(edge_comparator);

次に、std::sortランダム アクセス イテレータ以上でのみ使用でき、std::setイテレータは双方向です。

于 2013-04-10T12:38:04.033 に答える