3

次のように定義されているマップを使用しようとしています。

    map<Vertex,unsigned int> _addedVertices; 

find 関数を使用して頂点が既に内部にあるかどうかを確認すると、異なる情報を持つ間違った頂点への反復子が取得されるため、次のことを試しました。

    map<Vertex,unsigned int,cmpByVertexFields> _addedVertices; 

これは役に立ちませんでした。

また、Vertex クラス内に次のオーバーロードされた関数があります。

    bool operator<(const Vertex &otherV)const{
        return(_x<otherV._x && _y<otherV._y && _z<otherV._z);
    }
    bool operator==(const Vertex &otherV)const{
        return _x==otherV._x && _y==otherV._y && _z==otherV._z;
    }

しかし、何も機能しません。例: (0.2,0.1,0.4) を含む頂点を挿入しました。次に使用するのは、(0.2,0.15,0.41) を使用した検索関数です。取得する反復子は、map.end() ではなく最初の頂点です。

何を定義するのを忘れましたか? ありがとう

編集: cmpByVertexFields:

struct cmpByVertexFields {
    bool operator()(const Vertex& a, const Vertex& b) const {
        return a.getX()==b.getX() &&
            a.getY()==b.getY() &&
            a.getZ()==b.getZ();
    }
};
4

3 に答える 3

5

これはあなたの犯人です

bool operator<(const Vertex &otherV)const{
        return(_x<otherV._x && _y<otherV._y && _z<otherV._z);
    }

これは厳密な弱い順序付けにはなりません。

このようなものが必要です

bool operator<(const Vertex &otherV)const{
        if(_x != otherV.x)
               return _x < otherV.x;
        if(_y != otherV.y)
               return _y < otherV.y;
        return _z < otherV.z;
    }

または、同等かつより便利に、 std::tie を使用してそれらをタプルとして比較します

bool operator<(const Vertex &otherV)const{
       return std::tie(x_, y_, z_) < std::tie(OtherV.x_, OtherV.y_, OtherV.z_);
}
于 2013-07-20T11:47:57.180 に答える
4

Juan がコメントで述べたように、operator <実装は意味的に正しくありません。頂点について話しているので、実際には 、 、および の辞書式比較を実装する必要が_xあり_yます_z

最も簡単な方法は、std::tuple組み込みの比較を使用することです。

bool operator<(const Vertex &otherV)const{
    return std::tie(_x, _y, _z) < std::tie(otherV._x, otherV._y, otherV._z);
}

std::tieこの方法で使用することは、(メンバー) 変数全体で辞書式比較を実装する確立された方法になりましたoperator==(そして、実際に実装に同じものを使用できます)。

于 2013-07-20T11:47:49.657 に答える
4

以下の比較ファンクターは、厳密な弱い順序付けをoperator<実装する必要があります。これは の要件です。あなたのものはそうではありません。3D 頂点を順序付けする明確で自然な方法はありませんが、辞書順で順序付けしてから座標化したい場合は、次を使用するのが最も簡単な方法です(または、C++11 をサポートしていない場合)。std::mapxyzstd::tieboost::tiestd::tr1::tie

bool operator<(const Vertex &otherV)const{
    return std::tie(_x, _y, _z) < std::tie(otherV._x, otherV._y, otherV._z);
}

xこの順序は完全に恣意的であることに注意してくださいy。解決しようとしている問題に適した順序を実装するのは、あなた次第です。一方、マップの要素の実際の順序を気にしない場合は、厳格な弱い順序付けで十分です。

于 2013-07-20T11:48:14.580 に答える