如何从新插入的对(到地图)返回引用对?

时间:2011-09-04 00:45:18

标签: c++ data-structures std stdmap std-pair

如何正确有效地将一对从新插入的对返回到地图?

inline pair<unsigned int, T> *createObj(unsigned int UID){
    static pair<unsigned int, T> ret;

    objList.insert(pair<unsigned int, T>(UID, T()));

    if (UID_Counter <= UID) 
        UID_Counter = UID+1; 
    ret = make_pair(UID, objList.find(UID)->second);
    return &ret;
}

上面的内容会返回一个要使用的对象,但无论我在 ret 中更改的是什么,都不会在地图中的“真实对”中发生变化...

基本上我想要达到的目标是:

  1. 将新的对象Z 插入地图A
  2. (“Child”-class)更改返回的对象Z中的内容
  3. 在每个更新周期中,遍历地图A 中的对象,并使用加载到对象“A- Z ”中的实际数据更新...

1 个答案:

答案 0 :(得分:4)

您正在使用的insert的特定重载会返回std::pair<iterator, bool>。特别是该对的第一个成员是新插入的元素或已存在的元素的迭代器。因此:

pair<const unsigned int, T>&
createObj(unsigned int UID)
{
    auto inserted = objList.insert(pair<unsigned int, T>(UID, T()));

    if (UID_Counter <= UID) 
        UID_Counter = UID+1; 

    return *inserted.first;
}

请注意,我正在返回一个返回指针的引用,并且键类型为const unsigned int,而不是unsigned int。您也可以使用map_type::value_type(其中map_type是您的容器类型。)

如果您想知道为什么您的代码无效,那是因为您在ret内存储了映射对象的副本,因此通过您返回的指针进行的任何修改都只会影响该代码。