gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:38:45 25 4
gpt4 key购买 nike

当然,C++11 中新的 ranged-for 将非常简洁和有用。据我了解它是如何工作的,它通过尝试 *Argument-Depending-Lookup"( ADT)。

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

我有点困惑,一方面我想我应该使用 cbegin() 如果我做 not 想要修改容器,另一方面我必须在 ranged-for 中添加一个额外的 const 才能获得相同的结果。

所以,它看起来像这样:

// print all
for(const auto elem : data)
cout << elem

使用 ADT,找到 data.begin(),因此需要 const

// 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()

编辑:更正错误Value vs Iterator

最佳答案

cbegin() 允许您从非 const 容器中获取 const_iterators,而无需显式转换或转换。如果你有一个 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);

关于c++ - 我什么时候应该使用新的 ranged-for,我可以将它与新的 cbegin/cend 结合使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5814553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com