2009-04-27 29 views
1

私はいくつかの値のペアをstd :: mapに挿入しようとしています。 最初のケースでは、マップへのポインタを受け取って逆参照し、添え字演算子を使用して値を割り当てます。私はコレクションを反復処理しようとしたとき、すなわちC + + std :: mapに挿入する際の奇妙なバグ

(*foo)[index] = bar; 

その後、私が最初に(map.begin())の項目を除くすべてのケースでvalue属性に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++; 
    } 

} 

については、以下の実際のコードのいくつかのスニペットを貼り付けました。誰か提案をお願いしますか?

+0

どのようなタイプですか? – Skurmedel

答えて

12

(*cycleNodes)[tmp->getId()] == tmp; 

これは(@Neilバターワースを参照)マップにTMPを割り当てませんが、代わりに空の値を作成するマップに参照します - あなたの代わりに==ています=の。あなたが望むものは:

(*cycleNodes)[tmp->getId()] = tmp; 
+0

私は演算子[]の他の動作を認識していましたが、 "="の代わりに "=="を使用していなかったとは思えません!ありがとう、サイモン。 – Daniel

+0

あなたの親切な情報を他の人にもありがとう。 – Daniel

+0

何度も同じミスを犯した回数を数えることはできません。 –

2

あなたの値タイプに代入演算子がありますか?

this referenceをご覧ください。 []演算子は、値に対する非const参照を返します。あなたの割り当てが間違っているか、何らかの形で予期せぬことが起こった場合、これが原因かもしれません。

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

+0

ポインタは割り当て可能です。 – tstenner

4

次のように式の中で使用された場合1が存在しない場合、オペレータは[]のstd ::マップがマップに値を挿入することをあなたは知っておく必要があります。

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

するxの値が存在しない場合値型のデフォルトのコンストラクタによって作成された値が作成され、割り当てられます。組み込み型の場合は0が割り当てられます。これはほとんどあなたが望むものではなく、一般的にはオペレータ[]をマップで使用しないでください。あなたが持っているあなたの実際のコードで

+0

ありがとう!私はちょうどこの馬小路の部分に半日失った。 –