0

独自の comp 関数で宣言されたセットがあります。

set<int, my_comp> my_set;

比較関数は、他の場所に保存されているデータを使用して、どちらの int が大きいかを判断します。上記のデータが変更されると、セットの要素の順序も変更されます。

set はそれをどのように処理しますか? int の相対位置が変更された可能性があることがわかっている場合、それを削除して再度挿入する必要がありますか?

詳細: 特に、my_comp は int をインデックスとして使用してベクトルにアクセスし、ベクトルに含まれる値を比較します。これらの価値観は必ず変化します。

4

1 に答える 1

1

いいえ、 a の要素の厳密な弱い順序を変更してはなりません。std::setキーは として扱わなければなりませんconst

比較関数は厳密な弱い順序付けのモデルでなければなりません:

厳密な弱い順序付けには、次のプロパティがあります。 S のすべてのxy、およびz に対して、

  • すべてのxについて、 x < x (非反射性)とは限りません。
  • すべてのxyについて、x < yの場合、y < x (非対称) ではありません。
  • すべてのxy、および z について、x < yおよびy < zの場合、x < z (推移性)。
  • すべてのxy、およびzについて、xyと比較不可能であり、yzと比較不可能である場合、xは z と比較不可能です( 比較不能の推移性)。

より良い解決策は、おそらく sorted std::vector、 with std::sort(ソートする)、std::lower_bound(要素を見つけて挿入する)、std::inplace_merge(要素を挿入する) でしょう。

于 2013-10-01T20:10:53.487 に答える