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

问题描述 投票:0回答:2

来自Understanding iterator/const_iterator implementation

“尽管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++)
{

}
c++ stl iterator containers
2个回答
3
投票

具有任一类型的成员

不是

具有两种类型

[当他们说

具有任一类型的成员时,表示该类中没有iteratorconst_iterator类型的数据成员。

他们继续说

[iteratorconst_iteratorstd::vector的接口的一部分

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

0
投票
template <class T, class Allocator> class vector { using iterator = T *; // ... };

同样,其beginend必须返回iterator s,并且其cbegincend必须返回const_iterator s。但是,矢量对象不需要(必须包含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本身未定义iterator,也很好地定义了名称vector::iterator。除了一点之外,我可能不会介意提及这一点:尽管它不适用于vector,但有一个名为std::iterator的标准类,该类主要用作迭代器的基类,而大多数它确实完成了上面概述的工作-为value_typedifference_typereference等定义成员typedef。现在已不推荐使用它,但是仍然有相当数量的较旧的迭代器类使用它(该标准的较旧版本至少暗示大多数标准迭代器类型也应使用它)。

© www.soinside.com 2019 - 2024. All rights reserved.