2009-04-27 60 views
1

我試圖插入一些值對std :: map。 在第一種情況下,我收到一個指向地圖的指針,將其解引用並使用下標運算符來分配一個值。即奇怪的錯誤,而插入到C + + std :: map

(*foo)[index] = bar; 

後來,當我嘗試遍歷集合,我返回包含空值除第(map.begin())項目在所有情況下的價值屬性鍵/值對。奇怪的是,如果我做通過地圖的插入功能的插入,一切都很好,即:

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

爲什麼會變成這樣?這兩種方法在功能上是否相同?我已經粘貼了以下實際代碼的一些片段

... 
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 2009-04-27 13:05:41

回答

12

在您的實際代碼,您有:

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

這將不分配TMP進入地圖,而是將引用到地圖中創建一個空值(見@Neil北海) - 你已經代替== of =。你想要的是:

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

我意識到operator []的其他行爲,但我無法相信我錯過了使用「==」而不是「=」!謝謝西蒙。 – Daniel 2009-04-27 13:38:57

2

您的值類型是否有賦值運算符?

看看this reference。 []運算符返回值的非常量引用。如果您的任務錯誤或以某種意外的方式工作,這可能是原因。

另一方面,插入方法需要一個值並將其填充到地圖中。 []運算符用默認構造函數構造一個對象,然後讓它使用它的賦值運算符爲它分配內容。

+0

指針可指定。 – tstenner 2009-04-27 12:59:44

4

你應該知道,運營商[]性病::地圖將值插入地圖,如果在表達式中使用這樣當一個不存在:

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

如果x的值不存在,將創建一個值併爲其分配由值類型默認構造函數創建的值,對於內置類型則爲零。這幾乎不是你想要的,你通常應該避免使用operator []與地圖。

+0

謝謝!我剛剛失去了半天白癡。 – 2013-06-10 11:58:28