2010-09-07 60 views
1

我有一個包含struct Foo(不是指針)項目的hashmap。現在,我想要列出這些項目的指針。我怎樣才能做到這一點?C++:將hashmap內容複製到指針列表

我試着迭代散列表並將* iter插入到列表中,但指針在超出作用域時立即失效。

我應該能夠做到這一點沒有動態分配,不是嗎?

我喜歡這一點,這是行不通的: 的(...) { 美孚&欄= * ITER; list.insert(& bar); }

+1

這將有助於如果你會張貼一些代碼來演示問題。「這些指標一旦超出範圍就會失效,這是什麼意思?」你的意思是「只要散列表超出範圍?」 – 2010-09-07 05:32:43

+0

不是。散列圖是在整個程序運行期間有效的類的成員。 – Kiity 2010-09-07 05:34:18

回答

2

指向哈希映射中項目的指針將在迭代器失效的同時變爲無效。

如果你不加入散列映射(即在迭代它並獲取其元素的地址後不要插入/刪除/複製/任何東西),你的指針應該保持有效。

+0

我不管它,但它並沒有幫助 – Kiity 2010-09-07 05:39:45

+0

假設正在使用(來自STL)或'unordered_map'(來自C++ 0x)的'hash_map',那麼當元素添加到容器或從容器中移除元素時,迭代器不會失效(除了刪除一個元素時,顯然,該元素的任何迭代器都會失效)。 – 2010-09-07 05:44:14

+0

@James同意但基蒂沒有說明實現是什麼(儘管任何實現可以合理預期具有相同的屬性)。 – 2010-09-07 05:46:23

0

我有一個散列圖,其中包含結構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中 並插入& * ITER對名單 但很快,因爲它們超出範圍的指針得到無效的 。

如果您讓任何東西超出範圍,則不能使用此列表。如果你需要這個列表持久存在於創建它的函數的返回之後,一定要在堆上分配列表本身並返回一個指向它的指針。

我應該可以做到這一點,而不需要動態分配 ,不是嗎?

列表動態地分配節點。哈希映射可能在內部動態分配桶。但是,您不必動態地明確分配指向Foos的指針 - 所有Standard和類似的容器都會使用值語義(即Foo的拷貝構造函數或賦值運算符)將Foos複製到堆上。

我喜歡這一點,這是行不通的: 的(...){美孚&欄= * ITER; list.insert(& bar); }

它本身看起來不錯,錯誤是在你的代碼中的其他地方。這就是爲什麼你應該遵循詹姆斯的建議,並張貼足夠的代碼,我們可以指出你的錯誤。