c ++中的每个变量都有类似于int i
的类型,i
的类型为int
。
类似地,我们在STL中有迭代器,我们声明这样说
map<string,int>::iterator it .
此处it
的类型是什么?它是指针类型还是指针类型
在存储int或其他类型的向量的情况下,我们通过deference迭代器来获取与这些迭代器关联或指向的值。或者运算符*
在STL中为迭代器重载了?
答案 0 :(得分:6)
it
的类型是什么?
it
的类型是map<string,int>::iterator
,这是一个有一堆运算符重载的类。
对于某些容器类型,Container::iterator
可能是原始指针类型。对于map
,它必须是一个类。
答案 1 :(得分:4)
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 ++泛型编程和特征类的案例研究。