Как можно вернуть эталонную пару из недавно вставленной пары (на карту)? - PullRequest
2 голосов
/ 04 сентября 2011

Как правильно и эффективно вернуть пару из вновь вставленной пары на карту?

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. ("дочерний" -класс) Изменить содержимое возвращаемого объекта Z
  3. В каждом цикле обновления итерируйте объекты в карте A и используйте фактические данные, загруженные в объект"A- Z " при обновлении .. .

1 Ответ

4 голосов
/ 04 сентября 2011

Конкретная перегрузка 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, поэтому любое изменение через указатель, который вы вернули, повлияет только на эту копию.

...