我来自C背景。
当迭代包含连续内存中元素的vector或deque等容器时,通过递增迭代器指向向量中的下一个元素(例如在下面的循环中)很容易理解,它可能只是通过向量中元素的大小来增加迭代器的地址,在本例中为int。
vector<int> vec;
vector<int>::iterator it;
for (it = vec.begin; it != vec.end(); it++)
{
// do something on each element
}
我相信使用迭代器的好处是我们可以将算法代码与实际的容器类型分离,所以如果我们稍后决定使用列表而不是向量,我们可以在列表中使用与上面相同的迭代代码
可以以完全相同的方式遍历列表,但是列表将具有不在连续内存位置的元素,那么迭代器如何递增并找到下一个元素的正确地址?
我在C中实现链表的理解是我们将检查节点中的指针,可能称为&#34; next&#34;它指向列表中的下一个节点。
在使用列表迭代器时,这恰好是在C ++中发生的事情吗?因此,当迭代器指向列表元素时,为了指向下一个元素,编译器将生成与指向向量中下一个元素的代码完全不同的代码?提前致谢。
答案 0 :(得分:1)
你有正确的想法。关键点在于:
当迭代器指向列表元素
时
更好的措辞是“对于与链表一起使用的种迭代器”:没有一个迭代器可以指示vector
或的元素list
。
因为每个容器类型都有自己的迭代器类型,并且编译器始终知道正在使用的类型,所以在所有情况下都可以生成(并优化!)正确的代码。 (通用代码可以不使用显式类型编写,但必须为每次使用指定类型(或在某些情况下由编译器推断)。)
请注意,并非所有迭代器类型都是使用(仅)指针实现的:例如,deque<T>::iterator
通常将指向短数组的指针和指向该数组的索引捆绑在一起。模板系统还支持数据类型之间的大小和组成变化以及相应的操作。