C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其它序列的所有元素。语法形式:
for (declaration : expression)
statement
expression必须是一个序列,比如初始值列表、数组、vector或string等
declaration定义一个变量(非迭代器),序列中的每个元素都能转换成该变量的类型,一般可以使用auto类型说明符,由编译器帮助我们制定合适的类型。如果需要对变量值进行修改,则需要将变量声明为引用类型(例外,initializer_list中的对象均为const,无法修改)。
int main() {
vector<int> vi = {3, 5, 7};
for (auto &i : vi) {
i += 10;
cout << i << " ";
}
cout << endl;
return 0;
}
代码输出:13 15 17
上述代码等价于传统for语句:
int main() {
vector<int> vi = {3, 5, 7};
for (auto beg = vi.begin(), end = vi.end(); beg != end; ++beg) {
auto &i = *beg;
i += 10;
cout << i << " ";
}
cout << endl;
return 0;
}
由于范围for语句预存了end()的值,所以不能在遍历中进行序列元素的增加和删除。