c ++ 11 share_ptr作为映射键的值

时间:2016-01-27 02:39:57

标签: pointers c++11 share

我只是将pValue插入地图接下来我从地图中获取它,它的值应为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 ==插入[arg,20]
[key:arg,价值:32742]

1 个答案:

答案 0 :(得分:0)

map :: insert函数返回“pair”,其中该对中的boolean指示元素是否已插入。如果布尔值为true,则表示已插入。如果密钥已经存在,则布尔值将为false,并且尚未插入键值对。

尝试“auto insertResult = context.varIdentPool.insert(make_pair(leftNode.idName,pValue));” 如果insertResult.second == false,则密钥已存在。

迭代器(insertResult.first)将始终指向地图中的项目。

使用该迭代器,您可以通过“insertResult.first-&gt; second = newValue”来改变地图中的值