迭代器和 STL 容器的关系
Relationship of iterators and STL containers
我了解迭代器背后的一般思想,我可以在基本级别使用它们,但我不明白引擎盖下发生了什么以及它们与 STL 容器的关系。
从阅读 http://www.cplusplus.com/reference/iterator/iterator/:
- 迭代器是使用类模板定义的对象
-
"迭代器根据它们实现的功能分为五类">
-
有不同类型的迭代器(输入、输出、前向、双向、随机访问)
我的假设是(我将始终使用vector
作为示例)
- 在 STL 容器中,例如
vector
,迭代器是一个嵌套的类模板,是为每个唯一的vector
类型创建的。 - 被视为一种特定类型的迭代器的迭代器只是一个概念,因为它最终取决于在
vector
类中作为成员函数实现的内容。- 我的推理是,例如:
std::list<int>::iterator iterator;
是双向迭代器std::vector<int>::iterator iterator;
哪个是随机访问迭代器,两者都是用::iterator
声明的,并且没有区别。
- 我的推理是,例如:
begin()
和end()
等函数在vector
类中重载
我希望我说得有道理,请纠正我。
让我们逐点进行。
迭代器是使用类模板定义的对象
不一定。迭代器是具有特定操作的对象。指针是这样的对象,各种类类型的对象也是如此。
每个容器定义一个成员类型container::iterator
,另一个成员类型container::const_iterator
。
这些可以直接(嵌套类),也可以带有引用其他类型名称的类型别名。
迭代器根据其实现的功能分为五类
截至 C++14,是的。C++17和C++20分别引入了另一个类别。
有不同类型的迭代器(输入、输出、前向、双向、随机访问)
这些是(C++14)类别,但每个类别中都有无限种类型。std::vector<int>::iterator
是随机访问迭代器,double *
也是如此,但它们是不同的类型。这些类别重叠,定义是根据层次结构中的先前定义。RandomAccess
在 STL 容器中,例如
vector
中,iterator
是一个嵌套的类模板,是为每个唯一的向量类型创建的。
主要。在许多实现中确实如此,但是在std::vector<T>
的特殊情况下,没有规则阻止实现使用T *
作为iterator
类型。
被视为一种特定类型的迭代器的迭代器只是一个概念,因为它最终取决于在向量类中作为成员函数实现的内容。
是的。C++有一个概念概念,它只是以类似方式行为的事物的标签。由于模板的工作方式,满足特定概念的类型之间不需要有任何关系。对比 Java 和 C#,其中interface
必须在类型定义中明确提及。
像 begin() 和 end() 这样的函数在向量类中被重载
从字面上看,这是真的,但可能不是你的意思。每个容器都有一个名为begin
的成员函数。container::iterator container::begin()
和container::const_iterator container::begin() const
.
还有免费的函数模板std::begin
,它专门用于每个容器和(C样式)数组。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- C++GTKMM gui循环依赖关系
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 迭代器和 STL 容器的关系
- C++ STL 关系运算符如何比较堆栈
- STL 迭代器和数组的关系
- STL术语中的一对一关系
- STL和stdlib之间的关系是什么