2010-09-07 9 views
1

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

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

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

я так и не работает: для (...) { Foo & бар = * ИТЭР; list.insert (& бар); }

+1

Это поможет, если вы разместите код, демонстрирующий проблему.Что вы подразумеваете под «указатели становятся недействительными, как только они выходят за рамки?» Вы имеете в виду «как только хэшмап выходит за рамки?» –

+0

№ Hashmap является членом класса, который действителен во время всего запуска программы. – Kiity

ответ

2

Указатели на элементы в hashmap станут недействительными одновременно с потерей итераторов.

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

+0

Я оставляю это в покое, но это не помогает – Kiity

+0

Предполагая, что 'hash_map' (из STL) или' unordered_map' (из C++ 0x) используется, то итераторы не являются недействительными, когда элементы добавляются или удаляются из контейнера (за исключением того, что при удалении элемента любые итераторы этого элемента, очевидно, недействительны). –

+0

@James Согласен, но Китти не говорит, что такое реализация (хотя любая реализация может разумно ожидать, что она будет иметь одни и те же свойства). –

0

У меня есть hashmap, содержащий элементы структуры 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... 

Я попытался итерируем HashMap и вставьте & * ИТЭРа к списку но указатели получить признаны недействительными, как только они выходят за рамки ,

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

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

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

я так и не работает: для (...) {Foo & бар = * ИТЭР; list.insert (& бар); }

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

Смежные вопросы