2016-01-27 76 views
1

我只是P值插入到下個地圖,我得到它的地圖,它的值應該是20,但不是,爲什麼?C++ 11 share_ptr作爲值映射關鍵

typedef shared_ptr<BaseObject> PtrValue; 
class CodeExecuteContext{ 
    public: 
    map<string,PtrValue> varIdentPool; 
}; 



class BaseInteger :public BaseObject{ 
    public: 
     int value; 
     BaseInteger(int val):value(val){ 
      enumObjType = INT; 
     }; 
}; 

... 

PtrValue pValue = rightNode->executeCode(context); 
context.varIdentPool.insert(make_pair(leftNode.idName,pValue)); 

BaseInteger * baseInteger = (BaseInteger *) pValue.get(); 
cout << "==AssignmentASTFork== insert [ " << leftNode.idName << " , " << baseInteger->value << " ]" <<endl; 

map<string,PtrValue>::iterator it; 
for (it = context.varIdentPool.begin() ; it!=context.varIdentPool.end();it++) { 
    BaseInteger * baseInteger = (BaseInteger *) it->second.get(); 
    cout << "[key : " << it->first << ", value : " << baseInteger->value << endl; 
} 

結果:
== AssignmentASTFork ==插入[精氨酸,20]
[鍵:精氨酸,值:32742]

+0

我的猜測是,該地圖已包含此鍵更改地圖中的價值。 '地圖:: insert'是無操作在這種情況下 - 它不更換新價值現有的值。 –

回答

0

地圖::插入功能返回 「配對」,其中該對中的布爾值指示該元素是否已插入。如果布爾值爲true,則它已被插入。如果鍵已經存在,則布爾值將爲false,並且鍵值對尚未插入。

嘗試 「自動insertResult = context.varIdentPool.insert(make_pair(leftNode.idName,p值));」 如果insertResult.second ==假的,關鍵已經存在。

迭代器(insertResult.first)將始終指向地圖中的項目。

有了這個迭代,你可以通過「insertResult.first->第二= NEWVALUE」

+0

它的工作原理!我在地圖上插入相同的密鑰。因此,如果存在相同的鍵,它會失敗不會取代舊值時插入 –

+0

如果你想插入,或更新語義,使用'地圖[關鍵] = val',而不是'insert'。 –