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

时间:2011-04-28 06:31:19

标签: c++ for-loop c++11 foreach idioms

当然,C ++ 11中新的 ranged-for 非常简洁实用。据我了解它是如何工作的,它会通过尝试* Argument-dependent-Lookup(ADT)来查找“容器” beginend

但另一个补充是,所有容器现在都有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
  • 我是否错过了ranged-for,仅查找begin()

修改:更正错误价值与迭代器

2 个答案:

答案 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。这是首先添加它们的明显原因。

这很难说是惯用的,因为新的标准甚至不在印刷机之外!