tow*_*owi 14 c++ foreach for-loop idioms c++11
当然,C++ 11中新的ranged-for将非常简洁和有用.据我了解它是如何工作的,它会查找"容器" begin并end尝试*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)
| 归档时间: |
|
| 查看次数: |
3316 次 |
| 最近记录: |