在STL库中,一些容器具有迭代器,并且通常认为它们是迭代这些容器的优越方式,而不是简单的循环,例如
for ( int i=0; i < vecVector.size(); i++ ) { .. }
任何人都可以告诉我为什么以及在什么情况下我应该使用迭代器以及在什么情况下上面的代码片段?
请注意,vector的通常实现不会使用"int"作为索引/大小的类型.因此,您的代码至少会引发编译器警告.
迭代器增加了代码的通用性.
例如:
typedef std::vectorContainer ; void doSomething(Container & p_aC) { for(Container::iterator it = p_aC.begin(), itEnd = p_aC.end(); it != itEnd; ++it) { int & i = *it ; // i is now a reference to the value iterated // do something with "i" } }
现在,让我们假设您将向量更改为列表(因为在您的情况下,列表现在更好).您只需要更改typedef声明,然后重新编译代码.
如果您使用的是基于索引的代码,则需要重新编写代码.
应该将迭代器视为一种超级指针.它"指向"值(或者,如果是映射,则指向键/值对).
但它有方法移动到容器中的下一个项目.或者之前的.一些容器甚至提供随机访问(向量和双端队列).
大多数STL算法适用于迭代器或迭代器范围(同样,因为通用性).这里你将无法使用索引.
使用迭代器可以使代码与容器的实现无关.如果您的容器的随机访问便宜,那么性能方面没有太大区别.
但在很多情况下,你不会知道是否是这种情况.如果您尝试在链接列表上使用您的方法,例如,使用下标,容器将必须在每次迭代时遍历列表以查找您的元素.
因此,除非您确定对容器的随机访问是便宜的,否则请使用迭代器.