2

3D 空間の点を表すために使用される Point という名前のクラスがあります (外部ライブラリでは、コードを変更できません)。

int x = 0; int y = 0; int z = 0;
Point my_point p(x,y,z);

==and!=演算子はオーバーロードされますが、 <or演算子はオーバーロードされません>。それらを効率的な方法で保存する必要があります(二重要素なし、繰り返しなし)。私のデータ構造は だと思っていsetましたが、使用しようとすると、次のエラーが発生します。

error: no match for ‘operator<’ in ‘__x < __y’

いくつかのアドバイス?

4

3 に答える 3

5

比較演算子を記述し、それをインスタンス化しますset

struct ComparePoints
{
    bool operator()( Point const& lhs, Point const& rhs ) const
    {
        if ( lhs.x != rhs.x ) {
            return lhs.x < rhs.x;
        } else if ( lhs.y != rhs.y ) {
            return lhs.y < rhs.y;
        } else {
            return lhs.z < rhs.z;
        }
    }
};

std::set <Point, ComparePoints> mySet; 
于 2012-04-18T09:21:34.417 に答える
3

比較ファンクターを定義して、2 番目のテンプレート引数として std::set に渡すことができます。ここを見て、見てくださいCompare。を定義することもできbool operator<(const Point& lhs, const Point& rhs)ますが、クラスに触れることができない場合は、 のパブリック インターフェイスを介して比較を実装できる必要がありますPoint

于 2012-04-18T09:21:51.393 に答える
1

演算子 < を自分で定義できます。x、y、および z が Point のパブリック インターフェイスから利用できる場合は、Point クラス内にある必要はありません。

bool operator<(const Point& lhs, const Point& rhs)
{
  if( lhs.x != rhs.x ) return lhs.x < rhs.x;
  if( lhs.y != rhs.y ) return lhs.y < rhs.y;
  return lhs.z < rhs.z;
}
于 2012-04-18T09:23:11.883 に答える