簡體   English   中英

重載運算符-> STL迭代器

[英]Overload operator-> for STL iterator

我正在編寫自己的C ++ STL映射容器實現。 現在,我正在嘗試實現迭代器。 它應該允許您執行iter-> first和iter-> second之類的操作,分別返回鍵/值,並且iter是對象而不是指針。 我想知道我應該如何重載? 這有點令人困惑,因為我不確定返回類型應該是什么。 我想,它必須是成員第一/第二的對象。 返回對包裝器/接口對象或類似對象的引用是典型的嗎?

如果您真的是C ++標准庫,那么mapvalue_typepair 一對有firstsecond成員。 map取消引用迭代器可以得到一pair

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

至於類型:標准庫迭代器通常會取消對value_type類型的引用。 對於map<K,V> ,其值類型為std::pair<K, V> (或更確切地說, pair<key_type, mapped_type> ),這是從中獲取第first / second接口的位置。

(Stephan Lavavej的演講之一解釋了MSVC ++實現如何將相同的底層數據結構用於setmap ;唯一的區別是set::value_type等於set::key_type ,而map::value_typepair<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM