C++11开始,可以使用关键字auto代替迭代器的精确类型。
因此如果我们直接以begin()初始化迭代器,就可以使用auto声明其类型:
for(auto pos = obj.begin(); pos != obj.end(); ++pos)
{
cout << *pos << ' ';
}
auto优点之一就是程序比较浓缩精简。
如果没有auto,循环内生命迭代器动作应该(举例)如下:
for(list<char>::const_iterator pos = obj.begin();
pos != obj.end();
++pos)
{
cout<< *pos << ' ';
}
另一个优点是,采用这种循环写法,万一容器类型有所改变,程序整体仍能保持较佳的强壮性。
然而缺点是:
迭代器丧失常量性,可能引发“计划外的赋值”风险。
因为
auto pos = obj.begin()
会使pos成为一个非常量迭代器,此乃因为begin()返回的是个类型为cont::iterator
的对象。
为确保仍可使用常量迭代器,c++11起容器提供cbegin()和cend(),它们返回一个类型为cont::const_iterator
的对象:
for(auto pos = obj.cbegin(); pos != obj.cend(); ++pos)
{
...
}