来自Understanding iterator/const_iterator implementation:
“尽管
iterator
和const_iterator
是在范围内声明的类型在vector
中,没有要求vector
(或任何STL容器)具有以下任一成员类型-iterator
和const_iterator
是以下接口的一部分std::vector
例如成员begin()
的重载返回这些类型,但是关于这些函数如何获得迭代器的内容却没有提及返回“另外,STL容器必须具有:
“返回迭代器的开始和结束函数”
上面指出iterator
和const_iterator
不是STL容器的必需成员,例如vector
。我认为这意味着从.begin
或.end
返回的类型将根据实现而有所不同。
[所以我想知道为什么这没有问题,因为我看到很多人写出std::vector<someType>::iterator
或std::vector<someType>::const_iterator
,其中指定了iterator
和const_iterator
而不是例如使用auto
:
for (std::vector<int>::iterator i = s.begin(); i != s.end(); i++)
{
}
具有任一类型的成员
不是具有两种类型
[当他们说具有任一类型的成员时,表示该类中没有
iterator
或const_iterator
类型的数据成员。他们继续说
[
iterator
和const_iterator
是std::vector
的接口的一部分
这是正确的,因为标准要求std::vector
在其界面中显示这些类型。
template <class T, class Allocator>
class vector {
using iterator = T *;
// ...
};
同样,其begin
和end
必须返回iterator
s,并且其cbegin
和cend
必须返回const_iterator
s。但是,矢量对象不需要(必须包含iterator
或const_iterator
类型的任何对象。
还请注意,尽管需要定义名称vector::iterator
和vector::const_iterator
,但并非必须完全由vector
本身来定义它们。您可以(例如)从基类派生的矢量定义适当的名称:
template <class T> class vector_base { public: using iterator = T*; using const_iterator = T const *; // ... }; template <class T, class Allocator> class vector : public vector_base<T> { };
因此,即使vector
本身未定义iterator
,也很好地定义了名称vector::iterator
。除了一点之外,我可能不会介意提及这一点:尽管它不适用于vector
,但有一个名为std::iterator
的标准类,该类主要用作迭代器的基类,而大多数它确实完成了上面概述的工作-为value_type
,difference_type
,reference
等定义成员typedef。现在已不推荐使用它,但是仍然有相当数量的较旧的迭代器类使用它(该标准的较旧版本至少暗示大多数标准迭代器类型也应使用它)。