可能重复:
为什么使用迭代器而不是数组索引?
因为就我的一生而言,我不知道它们是如何不多余的。
vector<string>::iterator iter1
vector<string>::const_iterator iter2
也许他们更快?
迭代程序的目的不是更快,而是更快,而且更通用。array[i]
仅对数组有效,对链表无效。
迭代程序允许开发与容器无关的算法。通过这种方式,像std::sort
这样的东西实际上不必关心它是vector
还是your_datastructure_here
,只要它满足适当的迭代器要求。
考虑在list
、vector
或裸阵列中查找最大值。
int A[...]; // ...some array
std::list<int> L; // ...some list
std::vector<int> V; // ...some vector
int* maxA = std::max_element(A, A + 10);
std::list<int>::iterator maxL = std::max_element(L.begin(), L.end());
std::vector<int>::iterator maxV = std::max_element(V.begin(), V.end());
在通过向量进行"随机访问"的简单情况下?编号
事实上,您的向量迭代器可能是根据数组访问定义的,并且将同样快速。
您获得的是在通用编程中使用它们的能力。您可能并不总是使用向量,也不是所有容器都支持随机访问。
使用迭代器不仅是为了保持一致性,也是为了利用这种一致性所提供的模板元编程的能力。
而且,如果没有别的,它们是一个安全而有用的抽象概念。
它们推广到其他数组[i]慢得多(例如列表)甚至不可能(记录集)的集合。
STL算法也使用它们。STL算法设计用于任何可迭代集合——为什么要排除向量?
两个迭代器的存在——一个是const
,另一个不是——是由常量引用在C++中的工作方式引起的。如果你所拥有的只是一个向量的const
引用,为什么你应该能够改变里面的东西?因此CCD_ 9。规则CCD_ 10返回对元素的可写引用。
Iterators是一个通用概念。它们可以在各种容器上工作,并且具有类似的界面。
像arr_int[i]
那样直接访问数组元素肯定更快,因为它直接转换为指针算术。