C++特性之区间迭代
来源:互联网 发布:上海数据交易中心 coo 编辑:程序博客网 时间:2024/06/10 15:22
C++11系列-区间迭代
在我前面介绍C++11的文章中,我提到C++11将会带来一些实用的改进。我的意思是它将移除一些不必要的打字和其它影响快速编码的壁垒。我前面讲过的auto关键字就是一个例子;现在我想讲一下区间迭代(range-based for loop)。
区间迭代的基本语法
近来,基本上所有现代编程语言都有一种对一个区间写for循环的便捷方式。最终,C++也有了相同的概念;你可以给循环提供一个容器,它帮你迭代。前面我们已经在什么是C++11中看到了一些简单的例子。让我们回忆一下区间迭代的样子:
上面代码打印一个名叫vec的vector的内容,用i去捕获vector里面的值,直至vector的最后。你也可以用auto代替类型便利的迭代复杂的数据结构。例如,迭代一个map:
修改vector的值
假如你想修改你正在迭代的容器的值,或者你想避免拷贝大对象,你可以用引用的变量遍历。比如,下面的迭代对一个整形vector中每个元素的值加1。
区间意味着什么?
Strings,arrays,和所有的STL容器可以被新的区间迭代方式迭代。但是如果你想让你自己的数据结构使用这个新语法怎么办?
为了使这个数据结构可迭代,它必须类似于STL迭代器。
- 这个数据结构必须要有begin和end方法,成员方法和独立函数都行,这两个方法分别返回开始和结束的迭代器
- 迭代器支持*操作符、!=操作符、++方法(前缀形式,成员函数和独立函数都行)
就这些!实现这五个函数,你就可以有一个支持区间迭代的数据结构。因为begin、end可以是非成员函数,你甚至可以适配现有数据结构而不用实现STL风格的迭代器。所有你要做的是创建你自己的支持*、前缀++和!=的迭代器,并且定义好自己的begin、end。
区间迭代如此NICE。所以我怀疑大部分还不支持STL迭代模型的容器都会想添加某种适配方式以支持区间迭代。这里有一个小程序演示创建一个支持区间迭代的迭代器。这个例子里,我创建了一个固定Size是100的IntVector,并且可以被一个叫做Iter的类迭代。
注意这段代码中区间迭代时,不允许以引用修改IntVector中的元素。这是为了不使代码变长而影响代码的主要结构,所以并没添加返回引用类型的函数。
区间迭代提升性能?
在我使用GCC4.6的有限的测试中,我并没看到区间迭代相对于标准STL迭代的性能提升,但好像可以和STL中的for_each拥有同样的性能。
编译器支持
不幸的是,区间迭代的编译器支持的不好。MSVC11以后开始支持,GCC是4.6以后支持。
来源:http://towriting.com/blog/2013/08/20/ranged-for-loop/
- C++特性之区间迭代
- python高级特性之迭代
- 十五、高级特性之迭代
- C++11 区间迭代
- 2016.4.7Python高级特性之切片与迭代
- jstl c标签之迭代标签
- Python 高级特性 : 迭代
- python高级特性 - 迭代
- C++11系列-区间迭代
- C++11系列-区间迭代
- C++11系列-区间迭代
- C++11系列-区间迭代
- qt,c++,迭代
- c++ 11 0x11 新特性之auto 及 for的自动迭代
- python高级特性(2):迭代
- python之迭代
- 【C++】C++11特性:模板推导和循环区间
- c:foreach迭代map
- Qt中Ui名字空间以及setupUi函数的原理和实现
- Windows动态分析技术
- [leetcode]189.Rotate Array
- corba
- Activity 的生命周期
- C++特性之区间迭代
- Linux NFS共享
- 测量中的坐标与时间系统1.1(在大地测量学中)
- C++11之lambda函数
- 大函数分成小函数集合的优缺点
- C++实现简易计算器
- 使用DBMS_LOCK防止会话阻塞
- Unity Shader-后处理:景深
- Activity 的启动模式