C++ では、std::set::insert() は、同じ「値」を持つ値がまだ存在しない場合にのみ、値を挿入します。同様に、これは operator== を意味するのでしょうか、それとも operator< がいずれかの順序付けで false であるものを意味するのでしょうか、それとも何か他のことを意味するのでしょうか?
3 に答える
いずれかの順序で operator< が false であるものを意味しますか?
はい、セットがデフォルトのコンパレータを使用し、 を使用してキーを比較する場合<
。より一般的には、コンパレータ付きの順序付けられたコンテナではCompare
、2 つのキーk1
とは同等とk2
見なされます。!Compare(k1,k2) && !Compare(k2,k1)
実装などにキーは必要ありませoperator==
ん。それらは、コンテナのコンパレータを使用して厳密な弱い順序付けを行うことで比較可能である必要があります。
std::setには、次の署名のように「Compare」というテンプレート引数があります。
template < class Key, class Compare = less<Key>,
class Allocator = allocator<Key> > class set;
Compare
要素間の順序を決定するために使用されます。ここで、デフォルトでless<Key>
は<
演算子を使用して 2 つのキーを比較します。
それが役立つ場合は、セットを無意味な値を持つ単なる astd::map
と考えることができます。つまり、aは値が無意味な場所であるstd::set<int>
と考えることができます。std::map<int, int>
set
実行が許可されている唯一の比較T
は、テンプレートの一部として比較を行うために指定されたファンクター型を介したものです。したがって、それが同等性を定義する方法です。
のすべての値について、set
その値と新しい値の間の 2 つの順序付けのいずれかについて、比較が true と評価される必要があります。いずれかの値に対して両方の方法で false の場合、保存されません。