2011-10-14 51 views
1

我正在編寫我自己的C++ STL映射容器的實現。現在我試圖實現迭代器。它應該允許你做一些事情,比如iter-> first和iter-> second,分別返回鍵/值,而iter是一個不是指針的對象。我想知道我該如何超載?這有點令人困惑,因爲我不確定返回類型應該是什麼;它必須是一個會員頭/秒的對象,我想。通常是返回一個包裝器/接口對象的引用或類似的東西?重載操作符 - >爲STL迭代器

回答

3

標準圖的value_type是std::pair<const KeyType, MappedType>

爲了實現正常的指針語義,operator*返回一個引用,而operator->返回一個指針。

//minimal example 
#include <utility> 
#include <cstdio> 

struct It 
{ 
    std::pair<const int, int> pair; 
    std::pair<const int, int>* operator->() { return &pair; } 
    std::pair<const int, int>& operator*() { return pair; } 
}; 

int main() 
{ 
    It it = {std::make_pair(10, 20) }; 
    (*it).second = 30; 
    std::printf("%d %d\n", it->first, it->second); 
} 
1

您的問題的答案是肯定的。您應該返回一個代理對象或對代理對象的引用來獲取該行爲。

6

如果您確實是指C++標準庫,那麼mapvalue_typepair。一對有成員firstsecond。取消引用map中的迭代器會爲您提供pair

+0

即使提問的真正含義STL中,''一個的map' value_type'仍然是一個'pair' ;-p –

+0

@SteveJessop:我不能到說話,但如果是這樣的話,那太棒了! –

6

是的,您需要一個代理來保存相關參考。

至於類型:標準庫迭代器通常取消引用value_type類型的東西。對於map<K,V>,值類型爲std::pair<K, V>(或更確切地說,pair<key_type, mapped_type>),這是您從中獲得接口的地方。

(一斯蒂芬Lavavej的講座介紹了MSVC++實現是如何使用的setmap相同的基礎數據結構;唯一的區別是,set::value_type等於set::key_type,而map::value_typepair<key_type, mapped_type>這樣,你可以用分辨出兩者分開。簡單特徵檢查,但迭代器接口實際上是相同的。)

2

std::map<K,V>::iterator對類型爲std::pair<K,V>的對象進行迭代。