【发布时间】:2010-12-31 23:51:04
【问题描述】:
string::iterator it;
for (it = str.begin(); it < str.end(); it++)
cout << *it;
cout << endl;
为什么不:
for (int i = 0; i < str.size(); i++)
cout << str[i];
cout << endl;
似乎 string::iterator 也不提供范围检查。为什么要使用string::iterator 而不是索引?
谢谢。
【问题讨论】:
-
@jcyang:除了其他人的答案,请确保您养成在循环中使用预增量和迭代器的习惯。即使用 ++it 而不是 it++。预增量不会创建不必要的临时变量。
-
除了 Jagannath 的评论之外,在将迭代器与
end()进行比较时,更喜欢operator!=()而不是operator<()。 -
@jcyang:后自增的典型实现是
MyIterator operator++(int) { MyIterator temp(*this); ++*this; return temp; }。无论是否分配,这都会产生不必要的临时性。我隐含地假设我们也覆盖了(覆盖?覆盖?)预增量。 -
@jcyang:最好使用++i。因为如果您稍后更改使用的类型,那么您无需担心更改代码。无论循环变量的类型是什么,您现在都将始终拥有最有效的版本。
-
@jcyang:迭代器(通常)没有为它们定义运算符