c++11 share_ptr 作为映射键的值
c++11 share_ptr as value a map key
我只是将 pValue 插入到 map 接下来我从 map 获取它,它的值应该是 20,但不是,为什么?
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== insert [ arg , 20 ]
[键:arg,值:32742]
map::insert函数returns"pair",其中pair中的布尔值表示元素是否已经插入。如果布尔值为真,则它已被插入。如果密钥已经存在,则布尔值将为 false,并且尚未插入 key-value 对。
尝试"auto insertResult = context.varIdentPool.insert(make_pair(leftNode.idName,pValue));"
如果 insertResult.second == false,则密钥已经存在。
迭代器 (insertResult.first) 将始终指向地图中的项目。
使用该迭代器,您可以通过 "insertResult.first->second = newValue"
更改映射中的值
我只是将 pValue 插入到 map 接下来我从 map 获取它,它的值应该是 20,但不是,为什么?
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== insert [ arg , 20 ]
[键:arg,值:32742]
map::insert函数returns"pair",其中pair中的布尔值表示元素是否已经插入。如果布尔值为真,则它已被插入。如果密钥已经存在,则布尔值将为 false,并且尚未插入 key-value 对。
尝试"auto insertResult = context.varIdentPool.insert(make_pair(leftNode.idName,pValue));" 如果 insertResult.second == false,则密钥已经存在。
迭代器 (insertResult.first) 将始终指向地图中的项目。
使用该迭代器,您可以通过 "insertResult.first->second = newValue"
更改映射中的值