2010-11-16 17 views
1

我剛剛完成在C++中實現通用跳過列表,我想爲它帶來一個 STL類似於map的迭代器。 重載「 - >」運算符時出現問題:需要將引用返回到iterator :: value_type,在我的情況下是std :: pair,其中K是鍵類型,V是我的值類型類似地圖的容器。 代碼如下:在C++中實現類似地圖的迭代器時的問題

value_type& operator->() { return value_type(inner->key, inner->value); } 

編譯器返回我一些仇恨消息關於臨時對象的引用,我 完全同意他的觀點;我的問題是:我應該如何將參考 返回給一對,而不必在我的迭代器類中放置一對成員?

回答

2
value_type& operator->() { return value_type(inner->key, inner->value); } 

你的返回類型是一個value_type的引用,但返回本地創建的實例,這將在功能/操作範圍的結束被銷燬(即收盤})。所以你返回垃圾參考,這就是爲什麼你的編譯器恨你。

如果您改爲按值返回,那麼您將擁有正確且功能強大的代碼。 (無論您應該返回的值取決於value_type類型。)

value_type operator->() { return value_type(inner->key, inner->value); } 

更妙的是保持一個value_type作爲類的成員字段,但是你說你不想要,所以這是唯一的其他現實選擇。

+0

好的,我錯過了這一點,我認爲這是需要返回一個參考。我還有一個與地圖迭代器有關的問題,它從我最初的問題中離題一點:爲什麼STL迭代器(如地圖一)具有std :: pair 的value_type而不是std :: pair 。爲什麼要多做一個鍵和值的副本,而不是僅僅返回對這些的引用呢? – fokenrute 2010-11-16 19:41:20

+0

由於像這樣強制執行僅供參考的合約通常比執行僅限價值的合約更復雜,更脆弱或更昂貴。 – 2010-11-16 19:48:12

+0

但是使用引用而不是值被認爲是不好的做法?一些STL算法會停止工作嗎? – fokenrute 2010-11-16 19:55:57

0

你在剪切中做的是創建一個新的value_type實例。這個對象當然會被刪除,一旦函數/方法操作符 - >()被留下,導致你只是返回指向無處。

你應該做的是返回一個引用到已經在你的列表中的適當元素。

2

首先,operator->應該返回一個指針,或者其他的東西有自己的operator->()方法。但是,如果您沒有value_type,即存儲了pair<const K,V>,則無法輕鬆返回指向它的指針。

您是否可以更改inner的定義使其成爲或包含pair?您可以添加訪問器,如key()value()以避免在大多數地方易混淆firstsecond

或者,取決於你需要這樣做的行爲,也許你應該使用不同的value_type typedef來描述你實際上做了什麼。

0

運算符 - >()應該只返回指向它們的指針或重載的operator - >()函數。這個函數的意義不在於執行' - >'操作本身,而是爲了提供' - >'操作符將在其上運行的對象或指針。

在你的情況,要完成這個,你需要返回一個指向pair的指針。如果你真的想避免把這對存儲在你的類中,你可以讓函數返回一個指向新分配對的智能指針,這樣在操作過程中不會發生內存泄漏。