实现某个类的迭代器
implementing an iterator of certain class
当创建向量的迭代器时,迭代器本身是指向向量所包含值的指针。因此*迭代器实际上是向量所持有的值。
所以我有两个问题:
-
在地图上使用迭代器时,迭代器实际上是什么?我的意思是,它的内部实现是什么?它是否像一个包含不同数据成员的结构?
-
如果我想实现我自己的迭代器,它包含几个数据成员,那么在创建迭代器时,我实际返回的是什么?
- 取决于实施。通常,
std::map
被实现为一个平衡的二进制搜索树。在这种情况下,迭代器可能会指向树中的一个节点
std::map
的迭代器是一个引用映射中保存的键值对的结构。使用begin()
或end()
得到的标准迭代器是双向迭代器。这意味着您可以在迭代器对象上调用++i
和--i
运算符,以便在映射中保存的项之间来回移动- 为什么要实现自己的迭代器?也许创建一个
class
或struct
并将其保存到std::vector<T>
会达到您想要的效果?!您可以通过std::vector<T>::iterator
访问迭代器。如果你真的想实现自己的迭代器,你应该问问自己,它是否应该作为测试适用于你自己的数据结构,或者你是否想与std data structures
兼容。如果是后者,则应该从迭代器实现派生,并根据需要对其进行修改。看看这个答案
迭代器本身是指向向量所包含值的指针。
向量迭代器不是一个指向值的指针,而是一个实现了operator *
的类,它返回由容器持有并由迭代器指出的值。如果是映射,您可以使用first
和second
字段访问密钥和值:
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
还实现了其他运算符:+, ++, -, --, ->, ==, !=
。此外,CCD_ 18还实现了CCD_。
我将类似std::map
的容器实现为红黑树(就像std::map
实现中经常使用的位置一样),迭代器实现只需要指向树节点的指针(常量和非常量版本)。每个树节点都包含指向两个子节点和父节点的指针(加上颜色位),这足以将树遍历到任意一个方向。一般来说,它取决于容器&迭代器类型(和实现),以及实现其功能所需的数据类型。例如,我的deque
迭代器有指向元素的容器和索引的指针,但迭代器的实现方式以及它们需要什么数据实际上取决于实现。
相关文章:
- 在文件上实现迭代器
- C++迭代器:实现迭代器类时出错
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 如何实现常量迭代器?
- 如何为我的容器实现随机访问迭代器?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 如何正确实现自动迭代器
- 了解迭代器/const_iterator实现
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 双向迭代器实现
- 链表迭代器实现C++
- 如何使用迭代器实现从序列的中间到开始的循环
- 如何为自定义模板化迭代器实现 std::d istance()
- 双链表迭代器实现的问题
- 迭代器实现 -(链表队列)
- std::sort 如何仅使用迭代器实现交换操作
- C++简单迭代器实现
- 迭代器实现问题
- get begin(VEC) / end(VEC)由它们之间的迭代器实现
- 自定义STL迭代器实现错误