c++ 中的每个变量都有一些类型,比如 in int i
,i
都有一个 type int
。同样,我们在 STL 中有迭代器,我们声明它是这样的
map<string,int>::iterator it .
这里的类型是什么it
?它是指针类型还是指针类型,因为我们通常尊重迭代器来获取与这些迭代器关联或指向的值,以防存储 int 或其他类型的向量。或者*
STL 中的迭代器重载了运算符?
的类型是
it
什么?
it
is的类型map<string,int>::iterator
,它是一个重载了一堆运算符的类。
对于某些容器类型,Container::iterator
可能是原始指针类型。因为map
,它必须是一个类。
24.2.1/1 [iterator.requirements.general] 总结得很好:
迭代器是指针的泛化,它允许 C++ 程序以统一的方式处理不同的数据结构(容器)。为了能够构建在不同类型的数据结构上正确有效地工作的模板算法,该库不仅形式化了接口,而且形式化了迭代器的语义和复杂性假设。
短语“指针的泛化”意味着指针是迭代器。std::vector<T>::iterator
允许为 typedef T *
。然而,大多数迭代器通过运算符重载来实现接口。(请注意,迭代器也不需要属于容器。)
这种语言是非常典型的 C++ 标准的编写方式。它描述了事物的行为方式,但避免根据基类定义接口。有多种迭代器:输入、输出、转发、双向和随机访问。每个都有不同的规范,虽然随机访问是双向接口的严格超集,但它们在 C++ 类型系统中完全不相关。
迭代器可以是任何具有++
和*
重载的类,以及std::iterator_traits
. 有一个基类std::iterator
可以std::iterator_traits
用来定义必要的接口。这是 C++ 泛型编程和特征类的一个很好的案例研究。