2

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

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 ”中的实际数据......
4

1 回答 1

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_typemap_type容器的类型在哪里)。

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

于 2011-09-04T00:59:52.977 回答