[英]Overload operator-> for STL iterator
我正在編寫自己的C ++ STL映射容器實現。 現在,我正在嘗試實現迭代器。 它應該允許您執行iter-> first和iter-> second之類的操作,分別返回鍵/值,並且iter是對象而不是指針。 我想知道我應該如何重載? 這有點令人困惑,因為我不確定返回類型應該是什么。 我想,它必須是成員第一/第二的對象。 返回對包裝器/接口對象或類似對象的引用是典型的嗎?
如果您真的是C ++標准庫,那么map
的value_type
是pair
。 一對有first
和second
成員。 在map
取消引用迭代器可以得到一pair
。
是的,您需要一個代理來保存相關參考。
至於類型:標准庫迭代器通常會取消對value_type
類型的引用。 對於map<K,V>
,其值類型為std::pair<K, V>
(或更確切地說, pair<key_type, mapped_type>
),這是從中獲取第first
/ second
接口的位置。
(Stephan Lavavej的演講之一解釋了MSVC ++實現如何將相同的底層數據結構用於set
和map
;唯一的區別是set::value_type
等於set::key_type
,而map::value_type
是pair<key_type, mapped_type>
。這樣,您可以通過簡單的特征檢查將兩者區分開,但是迭代器接口實際上是相同的。)
標准映射的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);
}
std::map<K,V>::iterator
遍歷類型為std::pair<K,V>
。
您的問題的答案是肯定的。 您應該返回一個代理對象或對代理對象的引用以獲得該行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.