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感谢您指出这一点!我已经七年没有碰过这个答案了,我只是回去更新了一下。