1

いくつかの値のペアを std::map に挿入しようとしています。最初のケースでは、マップへのポインターを受け取り、それを逆参照し、添え字演算子を使用して値を割り当てます。すなわち

(*foo)[index] = bar;

後でコレクションを反復処理しようとすると、最初の (map.begin()) アイテムを除くすべてのケースで、値属性に null を含むキーと値のペアが返されます。奇妙なことは、マップの挿入機能を介して挿入を行うと、すべてがうまくいくことです。

foo->insert(std::pair<KeyType,ValueType>(myKey, myValue));

これはなぜでしょうか?2 つの方法は機能的に同等ではありませんか? コンテキストのために、実際のコードのスニペットを以下に貼り付けました

...
typedef std::map<int, SCNode*> SCNodeMap;
...


void StemAndCycle::getCycleNodes(SCNodeMap* cycleNodes)
{
    (*cycleNodes)[root->getId()] = root;

    SCNode* tmp = root->getSucc();
    while(tmp->getId() != root->getId())
    {
        // (*cycleNodes)[tmp->getId()] == tmp; // crashes (in loop below)
        cycleNodes->insert(std::pair<int, SCNode*>(tmp->getId(), tmp));//OK
        std::pair<int, SCNode*> it = *(cycleNodes->find(tmp->getId()));
        tmp = tmp->getSucc();
    }

    // debugging; print ids of all the SCNode objects in the collection
    std::map<int, SCNode*>::iterator it = cycleNodes->begin();
    while(it != cycleNodes->end())
    {
        std::pair<int, SCNode*> p = (*it);
        SCNode* tmp = (*it).second; // null except for it = cycleNodes->begin()
        std::cout << "tmp node id: "<<tmp->getId()<<std::endl; 
        it++;
    }

}

私はすべてのアイデアがありません。誰か提案がありますか?

4

3 に答える 3

4

std::map の operator[] は、次のような式で使用された場合、マップに値が存在しない場合に値を挿入することに注意してください。

if ( amap[x] == 42 ) {
   ...
}

値 x が存在しない場合は、1 が作成され、値型の既定のコンストラクタによって作成された値が割り当てられるか、組み込み型の場合は 0 が割り当てられます。これはあなたが望んでいることはほとんどなく、通常、マップで operator[] を使用することは避けるべきです。

于 2009-04-27T13:00:59.503 に答える
2

値の型に代入演算子がありますか?

この参照を見てください。[] 演算子は、値への非 const 参照を返します。割り当てが間違っているか、予期しない方法で動作する場合は、これが原因である可能性があります。

一方、挿入メソッドは値を取り、それをマップに詰め込みます。[] 演算子は、デフォルトのコンストラクターを使用してオブジェクトを構築し、代入演算子を使用してオブジェクトを代入します。

于 2009-04-27T12:57:59.013 に答える