我什么时候应该使用新的ranged-for,我可以将它与新的cbegin/cend结合使用吗?

tow*_*owi 14 c++ foreach for-loop idioms c++11

当然,C++ 11中新的ranged-for将非常简洁和有用.据我了解它是如何工作的,它会查找"容器" beginend尝试*Argument-dependent-Lookup"(ADT).

但另一个补充是,所有容器现在都拥有cbegin()cend()获得const_iterators容器.

我有点困惑,一方面是我想我应该用cbegin()我如果不是,要修改的容器,另一方面我必须添加额外的const内部范围,为获得同样的事情.

所以,它看起来像这样:

// print all
for(const auto elem : data)
  cout << elem
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)
  • 我得到了"成语"吗?有什么补充吗?
  • 我应该什么时候使用cbegin
  • 我是否会错过一些begin()仅限于寻找的东西?

编辑:纠正错误值与迭代器

Ant*_*ams 14

cbegin()允许您在没有显式强制转换或转换的情况下const_iterator从非const容器中获取s .如果你有一个const容器,那么无论如何begin()都会返回const_iterator.

for构造使用begin()因为这是最通用的,它避免了太多特殊情况.此外,默认情况下,变量是,而不是迭代器或引用.

std::vector<int> v;
for(auto i: v) // i is an int
    dostuff(i);
Run Code Online (Sandbox Code Playgroud)

这样可以避免在复制元素时修改容器的问题.要获得参考,您需要声明它:

for(auto &i: v)
    dostuff(i);
Run Code Online (Sandbox Code Playgroud)