"迭代器"和"const_iterator"不是 STL 容器的必需成员?

`iterator` and `const_iterator` are not required members of STL containers?

本文关键字:quot 成员 不是 迭代器 const iterator STL      更新时间:2023-10-16

取自理解迭代器/const_iterator实现:

"虽然iteratorconst_iterator是在作用域中声明的类型vector,不要求vector(或任何STL容器(具有以下任一成员 类型 -iteratorconst_iterator是 接口的一部分 例如,std::vector成员的重载begin()返回这些类型, 但是没有说这些函数如何获得迭代器它们 返回">

此外,STL 容器必须具有:

"返回迭代器的开始和结束函数">

上面指出,iteratorconst_iterator不是 STL 容器的必需成员,例如vector。我认为这意味着从.begin.end返回的类型将根据实现而有所不同。

所以我想知道为什么这没有问题,因为我看到很多人写出std::vector<someType>::iteratorstd::vector<someType>::const_iterator指定iteratorconst_iterator的地方,而不是使用auto例如:

for (std::vector<int>::iterator i = s.begin(); i != s.end(); i++)
{
}

你读错了引文。 该人说

具有任一类型的成员

具有任一类型

当他们说具有任一类型的成员时,他们的意思是类中没有类型iteratorconst_iterator的数据成员。

他们确实继续说

iteratorconst_iteratorstd::vector界面的一部分

这是正确的,因为标准要求std::vector在其界面中显示这些类型。

std::vector通常包含一个typedef(或等效地,using(来指定名称iterator将引用的类型。简单来说,它可能是这样的:

template <class T, class Allocator>
class vector {
using iterator = T *;
using const_iterator = T const *;
// ...
};

同样,它的beginend必须返回iterators,其cbegincend必须返回const_iterators。但是,矢量对象不需要(不一定需要包含任何类型为iteratorconst_iterator的对象。

另请注意,尽管需要定义名称vector::iteratorvector::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本身没有定义iteratorvector::iterator这个名字也是有明确定义的。除了一点之外,我可能不会费心提及这一点:虽然它不适用于vector,但有一个名为std::iterator的标准类,它主要用作迭代器的基类,它所做的大部分内容几乎是上面概述的 - 定义value_type的成员 typedefsdifference_typereference等等。它的使用现在已经不推荐使用,但仍有相当数量的旧迭代器类使用它(并且该标准的旧版本至少暗示大多数标准迭代器类型也应该使用它(。