定义我自己的容器的迭代器

Sea*_*ean 12 c++ iterator

我对一些关于定义我自己的迭代器的概念感到困惑:

从这里:http://www.cs.northwestern.edu/~riesbeck/programming/c++/stl-iterator-define.html,这似乎建议使用定义运算符的内部迭代器类.许多其他人继承基类iterator来重新定义运算符.

我对应该使用哪种方法感到很困惑.为什么会这样

typedef ptrdiff_t difference_type;
Run Code Online (Sandbox Code Playgroud)

例如,在容器类的定义的开头?

非常感谢你!

tem*_*def 20

关于STL容器究竟是什么要求任何STL容器类型具有多个不同字段的C++规范.一些,像begin()end(),是功能,而其他,如iterator,类型.这些限制也适用于迭代器.这允许C++模板函数对其参数类型进行内省,以查找更多属性.例如,所有STL迭代器类型必须定义iterator_category包含编码其功能的类型的字段.这样,STL算法可以基于它们接受的迭代器的功率而具有不同功能的不同实现.类示例是distance函数,它接受两个迭代器并返回它们之间的空格数.如果输入是低位的,ForwardIterator或者BidirectionalIterator这是通过向前推进迭代器并计算采取的步数来进行的,这些步骤在O(n)中运行.如果输入是a RandomAccessIterator,那么只需减去迭代器就可以得到O(1)中的结果.

之前C++ 17,建议是包括<iterator>报头和继承std::iterator自动生成你需要必要的嵌套类型(reference,pointer等).该类型现已弃用,因此您需要手动添加typedefs或specialize std::iterator_traits来导出此信息.

至于你需要重载什么运营商,在最低限度,你需要得到++(前缀和后缀)==,!=,*(指针引用),和->定义.所有迭代器类型都支持这一点.对于双向迭代器或更高版本,您还应该--定义(前缀和后缀).最后,对于随机访问迭代器,你应该支持[],+,+=,-(备份许多步骤和减去两个迭代器)-=,<,>,<=,和>=.

希望这可以帮助!