0

C++ (gcc) で次のマップがあります。

map<int, EdgeExtended> myMap;

EdgeExtended の定義は次のとおりです。

struct EdgeExtended {
    int neighborNodeId;
    int weight;
    int arrayPointer;
    bool isCrossEdge;

    EdgeExtended(Edge _edge, int _arrayPointer) {
        neighborNodeId = _edge.neighborNodeId;
        weight = _edge.weight;
        arrayPointer = arrayPointer;
        isCrossEdge = _edge.isCrossEdge;
    }

    EdgeExtended(const EdgeExtended & _edge) {
        neighborNodeId = _edge.neighborNodeId;
        weight = _edge.weight;
        arrayPointer = _edge.arrayPointer;
        isCrossEdge = _edge.isCrossEdge;
    }

    EdgeExtended(int _neighborNodeId, int _weight, bool _isCrossEdge, int _arrayPointer) {
        neighborNodeId = _neighborNodeId;
        weight = _weight;
        arrayPointer = _arrayPointer;
        isCrossEdge = _isCrossEdge;
    }

    void setValues(int _neighborNodeId, int _weight, bool _isCrossEdge, int _arrayPointer) {
        neighborNodeId = _neighborNodeId;
        weight = _weight;
        arrayPointer = _arrayPointer;
        isCrossEdge = _isCrossEdge;
    }

    EdgeExtended() {
        neighborNodeId = -1;
        weight = -1;
        arrayPointer = -1;
        isCrossEdge = false;
    }
};

私はこれをしたい(わかりやすい例):

EdgeMap edge;
int nodeId=18;

edge=map.erase(nodeId);

a) このコードは正しいですか? 消去はキーに対応するオブジェクトを返しますか? b) はいの場合、キーが存在しない場合、消去は何を返しますか? c)このコードが間違っている場合、キーが存在するかどうか、オブジェクトがキーにマップされているかどうかを確認し、マップからペアを消去するにはどうすればよいですか。パフォーマンスはかなり重要であるため、最も効率的な方法が必要であることを覚えておいてください。

4

3 に答える 3

2

a) このコードは正しいですか? 消去はキーに対応するオブジェクトを返しますか?

いいえ、これは削除された要素の数を返します。

b) はいの場合、キーが存在しない場合、消去は何を返しますか?

該当なし。単純に を返します0

c)このコードが間違っている場合、キーが存在するかどうか、オブジェクトがキーにマップされているかどうかを確認し、マップからペアを消去するにはどうすればよいですか。パフォーマンスはかなり重要であるため、最も効率的な方法が必要であることを覚えておいてください。

auto it = yourMap.find(nodeId);
if (it != yourMap.end()) {
   EdgeExtended theObjectToRemove = *it;
   yourMap.erase(it);
}

これの複雑さは、償却された一定の時間がかかるため、プレーンのerase(nodeId);場合と同じです。erase(it)

于 2013-02-06T20:38:13.710 に答える
2

a) いいえ、正しくありません。呼び出すstd::map::eraseメソッドは、消去された要素の数を返します。

できることは、std::map::findを使用して、指定されたキーを持つ要素がマップにあるかどうかを確認することです。これは、要素が存在する場合は要素へのイテレータを返し、存在end()しない場合はへを返します。この反復子を関連するstd::map::eraseオーバーロードに渡すことができます。

EdgeMap edge;
int nodeId=18;
ExtendedEdge removedEdge;
....
EdgeMap::iterator it = edge.find(nodeId);
if( it != edge.end() ) 
{
  // found element.
  removedEdge = it->second; // or removeEdge = std::move(it->second) in C++11
  edge.erase(it);
}
于 2013-02-06T20:32:36.033 に答える
1

次のように、イテレータを使用してそれを行います。

typedef map<int, EdgeExtended> EdgeMap;

bool RemoveEdge( EdgeMap & myMap, int nodeId, EdgeExtended &edge )
{
    EdgeMap::iterator e = myMap.find(nodeId);
    if( e == myMap.end() ) return false;
    edge = e->second;
    myMap.erase(e);
    return true;
}
于 2013-02-06T20:36:54.970 に答える