当然,C ++ 11中新的 ranged-for 非常简洁实用。据我了解它是如何工作的,它会通过尝试* Argument-dependent-Lookup(ADT)来查找“容器” begin
和end
。
但另一个补充是,所有容器现在都有cbegin()
和cend()
来获取容器的const_iterators
。
我有点困惑,一方面我想我应该使用cbegin()
如果我不想要修改容器,另一方面我必须添加一个额外的 ranged-for 中的const
可以获得相同的内容。
所以,它看起来像这样:
// print all
for(const auto elem : data)
cout << elem
使用ADT,找到data.begin(),因此需要const
。
VS
// print everything but the first (a reason not to use range-for)
for(auto it = data.cbegin()+1; it!=data.cend(); ++it)
cout << *it
使用data.cbegin()
,因此不需要const
。
但这不是更“惯用”吗?:
// print everything but the first (a reason not to use range-for)
for(const auto it = data.begin()+1; it!=data.end(); ++it)
cout << *it
cbegin
?begin()
?修改:更正错误价值与迭代器
答案 0 :(得分:14)
cbegin()
允许您从非const_iterator
容器中获取const
,而无需进行显式转换或转换。如果您有一个const
容器,那么begin()
无论如何都会返回const_iterator
。
新的for
构造使用begin()
,因为这是最常见的,它避免了太多特殊情况。此外,默认情况下,变量是值,而不是迭代器或引用。
std::vector<int> v;
for(auto i: v) // i is an int
dostuff(i);
这样可以避免在复制元素时修改容器的问题。要获得参考,您需要声明它:
for(auto &i: v)
dostuff(i);
答案 1 :(得分:0)
如果不打算修改范围内的元素,我会在for
循环中使用cbegin / cend。这是首先添加它们的明显原因。
这很难说是惯用的,因为新的标准甚至不在印刷机之外!