过载运算符 - >对于STL迭代器

时间:2011-10-14 13:17:31

标签: c++ stl map iterator g++

我正在编写自己的C ++ STL地图容器实现。现在我正在尝试实现迭代器。它应该允许你执行类似iter-> first和iter-> second的操作,分别返回键/值,其中iter是一个对象而不是指针。我想知道我应该如何重载这个?这有点令人困惑,因为我不确定返回类型应该是什么;我认为它必须是成员第一/第二的对象。是否通常返回对包装器/接口对象的引用或类似的东西?

5 个答案:

答案 0 :(得分:6)

如果您的意思是C ++标准库,那么value_type的{​​{1}}就是map。成对的成员有pairfirst。在second中取消引用迭代器会为您提供map

答案 1 :(得分:6)

是的,您需要一个代理来保存相关参考。

对于类型:标准库迭代器通常取消引用类型为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>。这样你可以通过一个简单的特征检查告诉两者,但是迭代器接口实际上是相同的。)

答案 2 :(得分: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);
}

答案 3 :(得分:2)

std::map<K,V>::iterator遍历std::pair<K,V>类型的对象。

答案 4 :(得分:1)

你的问题的答案是肯定的。您应该返回代理对象或对代理对象的引用以获得该行为。