C ++: копирование содержимого hashmap в список указателей - PullRequest
1 голос
/ 07 сентября 2010

У меня есть hashmap, который содержит элементы структуры Foo (не указатели).Теперь я хочу, чтобы указатели этих элементов были в списке.Как я могу это сделать?

Я попытался перебрать хэш-карту и вставить & * iter в список, но указатели становятся недействительными, как только они выходят за рамки.

Я смогу сделать это бездинамическое распределение, не так ли?

Мне нравится это, и оно не работает: for (...) {Foo & bar = * iter;list.insert (& бар);}

Ответы [ 2 ]

2 голосов
/ 07 сентября 2010

Указатели на элементы в хэш-карте станут недействительными в то же время, когда итераторы станут недействительными.

Если вы оставите хеш-карту в покое (т.е. не вставляйте / не удаляйте / не копируйте / ничего / после того, как вы итерировали ее и принялиадреса его элементов), ваши указатели должны оставаться действительными.

0 голосов
/ 07 сентября 2010

У меня есть хэш-карта, которая содержит элементы структуры Foo (не указатели).Теперь я хочу, чтобы указатели этих элементов были в списке.Как я могу это сделать?

Примерно так:

typedef Whatever_Hash_Map<Foo> Container;
Container container;
...populate container...
std::list<Foo*> l;
for (Container::const_iterator i = container.begin(); i != container.end(); ++i)
    l.insert(&*i);
...use list...

Я попытался перебрать хэш-карту и вставить в список & & iter, но указатели получаютстановится недействительным, как только они выходят за рамки.

Вы не можете использовать этот список, если разрешите что-либо выйти из области видимости.Если вам нужно, чтобы список сохранялся после возврата функции, которая его создала, обязательно выделите сам список в куче и верните указатель на него.

Я должен сделать этобез динамического выделения, не так ли?

Список распределяет узлы динамически.Карта хеша, вероятно, внутренне распределяет сегменты динамически.Но вам не нужно явно выделять указатели на Foos динамически - все стандартные и подобные контейнеры будут копировать Foos в кучу, используя семантику значений (т. Е. Конструктор копирования Foo или оператор присваивания).

Мне нравится это, и оно не работает: for (...) {Foo & bar = * iter;list.insert (& бар);}

Это само по себе выглядит хорошо, ошибка в другом месте вашего кода.Вот почему вы должны следовать предложению Джеймса и опубликовать достаточно кода, чтобы мы могли указать на вашу ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...