"迭代器"和"const_iterator"不是 STL 容器的必需成员?
`iterator` and `const_iterator` are not required members of STL containers?
取自理解迭代器/const_iterator实现:
"虽然
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
在其界面中显示这些类型。
std::vector
通常包含一个typedef
(或等效地,using
(来指定名称iterator
将引用的类型。简单来说,它可能是这样的:
template <class T, class Allocator>
class vector {
using iterator = T *;
using const_iterator = T const *;
// ...
};
同样,它的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
的成员 typedefsdifference_type
,reference
等等。它的使用现在已经不推荐使用,但仍有相当数量的旧迭代器类使用它(并且该标准的旧版本至少暗示大多数标准迭代器类型也应该使用它(。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"