我正在編寫我自己的C++ STL映射容器的實現。現在我試圖實現迭代器。它應該允許你做一些事情,比如iter-> first和iter-> second,分別返回鍵/值,而iter是一個不是指針的對象。我想知道我該如何超載?這有點令人困惑,因爲我不確定返回類型應該是什麼;它必須是一個會員頭/秒的對象,我想。通常是返回一個包裝器/接口對象的引用或類似的東西?重載操作符 - >爲STL迭代器
1
A
回答
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++標準庫,那麼map
的value_type
是pair
。一對有成員first
和second
。取消引用map
中的迭代器會爲您提供pair
。
6
是的,您需要一個代理來保存相關參考。
至於類型:標準庫迭代器通常取消引用value_type
類型的東西。對於map<K,V>
,值類型爲std::pair<K, V>
(或更確切地說,pair<key_type, mapped_type>
),這是您從中獲得接口的地方。
(一斯蒂芬Lavavej的講座介紹了MSVC++實現是如何使用的set
和map
相同的基礎數據結構;唯一的區別是,set::value_type
等於set::key_type
,而map::value_type
是pair<key_type, mapped_type>
這樣,你可以用分辨出兩者分開。簡單特徵檢查,但迭代器接口實際上是相同的。)
2
std::map<K,V>::iterator
對類型爲std::pair<K,V>
的對象進行迭代。
相關問題
- 1. 重載操作符>>
- 2. 重載操作符>>()
- 3. STL迭代器重置
- 4. 超載==操作符的STL容器
- 5. 迭代器和STL容器
- 6. C++操作符「>>」重載錯誤
- 7. STL迭代器:container.end()
- 8. GNU的reverse_iterator的<Iterator> ::操作符 - >和代理迭代
- 9. STL地圖迭代器集
- 10. 使用迭代器作爲參數重載<<運算符
- 11. C++ STL列表迭代器
- 12. 重載==操作符爲空
- 13. C++ STL迭代器接口
- 14. C++迭代器操作符定義
- 15. 如何爲STL容器和算法函數編寫重載操作符?
- 16. 寫迭代器的STL
- 17. STL迭代器和'const'
- 18. STL,列表,迭代器
- 19. 定製STL迭代器類
- 20. STL迭代器和模板
- 21. 重載==操作符
- 22. 有關插入迭代器和重載運算符的C++ STL問題
- 23. 多態的通用STL迭代器
- 24. 迭代器操作問題
- 25. C++迭代器操作
- 26. 重寫代碼%>%操作
- 27. STL容器:兩個迭代器
- 28. stl映射的迭代器++複雜性
- 29. STL迭代器的std ::距離()錯誤
- 30. 爲什麼STL中List的迭代器使用(* node).data而不是node-> data?
即使提問的真正含義STL中,''一個的map' value_type'仍然是一個'pair' ;-p –
@SteveJessop:我不能到說話,但如果是這樣的話,那太棒了! –