2016-01-27 100 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'。 –