std::set
テンプレートは、一意のオブジェクトのソートされたセットを含む連想型コンテナを提供します。キーワードはで、とは一意のです。並べ替えをサポートするには、さまざまな可能性がありますが、最終的にはすべてがstrict weak orderingに準拠する必要があります。
std::set
の2番目のテンプレート引数は、の比較タイプです。デフォルトのstd::less<Key>
は、標準ライブラリから提供されます。Key
は、コンテナに格納するオブジェクトのタイプです(ケースでは、Point
)。このデフォルトでは、キータイプをサポートする任意の許容operator <
を使用して単純に比較を生成します。これはデフォルトのコンパレータ(あなたのケースでstd::less<Point>
)を使用している場合は、あなたのクラスは、このような操作を想定しなければならない、一つの方法または別のことを意味します。以下に表示され、これを行うための
Point pt1(args);
Point pt2(args);
if (pt1 < pt2) // <<=== this operation
dosomething();
複数のメソッド:
をは、これを実現する最も簡単な方法は、あなたのPoint
クラスのメンバーoperator <
を提供することで圧倒的にメンバーoperator <
を提供します。その際、pt1 < pt2
が有効になり、std::less<Point>
が満足しています。あなたのクラスを想定すると、従来のX、Y点であり、それは次のようになります。
struct Point
{
int x,y;
// compare for order.
bool operator <(const Point& pt) const
{
return (x < pt.x) || ((!(pt.x < x)) && (y < pt.y));
}
};
は、もう一つの方法は、カスタムコンパレータの種類を提供することでカスタムコンパレータタイプに
を提供するのではなくstd::less<Point>
に依存しています。これの最大の利点は、さまざまなことを意味するいくつかを定義し、必要に応じてコンテナやアルゴリズムで使用できることです。このアプローチを検討する
std::set<Point,CmpPoint> mySet;
何か:それと
struct CmpPoint
{
bool operator()(const Point& lhs, const Point& rhs) const
{
return (lhs.x < rhs.x) || ((!(rhs.x < lhs.x)) && (lhs.y < rhs.y));
}
};
、あなたは今、このようなあなたのstd::set
を宣言することができますタイプは、プライベートメンバ変数や関数へので、任意のアクセスPoint
の一部ではありません能力を盛り立てて説明する必要があります。
はフリー機能operator <
に単にoperator <
を提供グローバルフリー機能を提供しているもう一つのあまり共通のメカニズムを提供します。これはメンバ関数ではありません。これを繰り返すと、デフォルトのstd::less<Point>
が有効なコードになります。
bool operator <(const Point& lhs, const Point& rhs)
{
return (lhs.x < rhs.x) || ((!(rhs.x < lhs.x)) && (lhs.y < rhs.y));
}
これは、カスタムコンパレータとメンバーオペレータの両方が混在しているように見えますが、実際にはそれぞれの長所と短所の多くが出てきます。例:メンバーoperator <
のように、デフォルトのstd::less<Point>
を使用することができます。カスタムコンパレータと同様、これはクラス以外の関数なので、プライベートメンバーへのアクセスはfriendingまたはaccessorを介して提供する必要があります。
概要
ニーズのために、私は単純なアプローチで行くと思います。メンバーを作るだけですoperator <
。あなたはいつもあなたのPoint
をそのように注文している可能性があります。そうでない場合は、カスタムコンパレータを使用してください。 のいずれかケースを作る厳しい弱い秩序を守る。
これは 'std :: set'です。 'C2784'と' C2676'は意味をなさない。実際のメッセージが必要です。また、 'struct Point'が' operator <'を実装していることを確認しましたか? 'std :: set'はそれを必要とします。 – DeiDei
'Point'構造体の '演算子<'を定義します。 – void