C++ 定义自己容器的迭代器
我对定义自己的迭代器的一些概念感到困惑: 由此可知:,这似乎建议使用定义运算符的内部迭代器类。许多其他人继承基类C++ 定义自己容器的迭代器,c++,iterator,C++,Iterator,我对定义自己的迭代器的一些概念感到困惑: 由此可知:,这似乎建议使用定义运算符的内部迭代器类。许多其他人继承基类迭代器,以重新定义运算符 我对应该使用哪些方法感到困惑。为什么会有 typedef ptrdiff_t difference_type; 例如,在容器类定义的开头 多谢各位 > P>关于STL容器的C++规范要求任何STL容器类型都有几个不同的可用字段。有些是函数,如begin()和end(),而另一些是类型,如iterator。这些限制也适用于迭代器。这允许C++模板函数对它们的参
迭代器
,以重新定义运算符
我对应该使用哪些方法感到困惑。为什么会有
typedef ptrdiff_t difference_type;
例如,在容器类定义的开头
多谢各位 > P>关于STL容器的C++规范要求任何STL容器类型都有几个不同的可用字段。有些是函数,如
begin()
和end()
,而另一些是类型,如iterator
。这些限制也适用于迭代器。这允许C++模板函数对它们的参数类型进行内省,以查找更多的属性。例如,所有STL迭代器类型都必须定义一个iterator_category
字段,其中包含对其功能进行编码的类型。通过这种方式,STL算法可以根据其接受的迭代器的能力对不同的函数进行不同的实现。类示例是distance
函数,它接受两个迭代器并返回它们之间的空格数。如果输入是一个较低的前向迭代器
或双向迭代器
,则可以通过将迭代器向前推进并计算所采取的步骤数来工作,该步骤以O(n)为单位运行。如果输入是一个随机访问迭代器
,那么迭代器只需减去即可得到O(1)中的结果
在C++17之前,建议包含
头并从std::iterator
继承,以自动生成所需的嵌套类型(引用
,指针
,等等),因此,您需要手动添加typedef
s或专门化std::iterator\u traits
来导出此信息
至于您需要重载哪些运算符,您至少需要获得++
(前缀和后缀),==
,=定义了代码>、*
(指针解引用)和->
。所有迭代器类型都支持这一点。对于双向迭代器或更高版本,还应该定义--
(前缀和后缀)。最后,对于随机访问迭代器,您应该支持[]
,+
,+=
,-
(备份许多步骤并减去两个迭代器),-=
,
,=
希望这有帮助 虽然@templattypedef的答案是准确的,但也许我可以稍微澄清一下情况
迭代器通常定义为容器内的嵌套类std::iterator
通常用作基类,以便于您定义迭代器类。您永远不必真正使用std::iterator
——它只是为了让工作更轻松,并且(特别是)减少需要键入的代码量。事实上,std::iterator
已被正式弃用,因此不鼓励使用它。有一天它可能会从标准中删除(尽管我不知道它可能在什么具体日期被删除)
哦,出于与当前问题无关的原因,有时最好在被迭代的容器类之外定义迭代器。当迭代器类定义嵌套在容器定义中时,迭代器依赖于周围类的所有模板参数。但这很少是必要的或可取的。例如,具有不同分配器的两个向量通常仍然可以具有相同的迭代器类型——更改分配器不会更改迭代。尽管使用std::iterator
可能有助于typedef
的实现,但它肯定对实际实现没有帮助
在这方面,Boost.Iterator库有很多好东西,我建议您阅读一下,它大大减少了在旧迭代器的基础上定义新迭代器所需的代码量。谢谢!如果我在代码中键入typedefs,我就不再需要继承std::iterator了?@Sean:对。我写的迭代器不是从std::iterator
继承的,它们总是工作得很好(好吧,有些有bug,但独立于std::iterator
不是原因…)std::iterator不受欢迎。@static\u rtti感谢您指出这一点!我已经七年没有碰过这个答案了,我只是回去更新了一下。