实现某个类的迭代器

时间:2014-09-01 11:10:35

标签: c++ types iterator return implementation

在创建向量的迭代器时,迭代器本身是指向向量所持有的值的指针。因此* iterator实际上是向量所持有的值。

所以我有两个问题:

  1. 在地图上使用迭代器时,实际上迭代器是什么?我的意思是,它的内部实现是什么?它是否像一个包含不同数据成员的结构?

  2. 如果我想实现自己的迭代器,它包含多个数据成员,那么在创建迭代器时我实际上返回了什么?

4 个答案:

答案 0 :(得分:0)

  1. 取决于实施。通常,std::map实现为平衡二叉搜索树。在这种情况下,迭代器可能会指向树中的节点。

答案 1 :(得分:0)

  1. std::map的迭代器是一个引用地图中保存的键值对的结构。你得到的标准迭代器,即begin()end()是双向迭代器。这意味着您可以在迭代器对象上调用++i--i运算符,以便在地图中保存的项目之间/之后移动。
  2. 为什么要实现自己的迭代器?也许创建一个classstruct将其保存到std::vector<T>会做你想要的吗?!您可以通过std::vector<T>::iterator访问迭代器。如果你真的想要实现自己的迭代器,你应该问自己一个问题,它是否应该适用于你自己的数据结构作为测试,或者你想与ie std data structures兼容。如果是后者,则应该从迭代器实现派生出来并按照您的需要进行修改。请查看this回答。

答案 2 :(得分:0)

  

迭代器本身是指向矢量所持有的值的指针。

Vector迭代器不是指向value的指针,而是实现了operator *的类,它返回容器保存的值并由迭代器指出。如果是地图,您可以使用firstsecond字段访问密钥和值:

map<string, int> wheelMap;
wheelMap["Car"] = 4;

map<string, int>::iterator itWheel = wheelMap.begin();
cout << itWheel ->first << ":" << itWheel ->second << endl;  //This will print: Car:4

Map iterator还实施了其他运营商:+, ++, -, --, ->, ==, !=。 此外,vector还实施了operator []以按索引获取值。

答案 3 :(得分:0)

我实现了std::map - 像容器一样的红黑树(就像经常用于std::map实现一样)并且只有迭代器实现需要的东西(const和非const版本)都是指向树节点的指针。每个树节点都包含指向两个子节点和父节点(加上颜色位)的指针,足以将树遍历到任一方向。一般来说,这取决于容器和容器。迭代器类型(和实现)虽然需要什么样的数据来实现其功能。例如。我的deque迭代器有指向容器和元素索引的指针,但它实际上是特定于实现迭代器的实现方式以及它们需要什么数据。