初探c++11之for循环篇

转自:https://www.cnblogs.com/l00l/archive/2012/02/03/2337557.html

在很多语言中都有类似foreach之类的循环关键字。在C++11中,也添加了类似的语言特性。

不过,这里首先说一句,在STL已经有类似的东西,std::for_each,感兴趣可以自己查一下,这里不赘述。

 

首先,给出一个参考文档

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html

 

其次,给出一个示例

1 int array[5] = { 1, 2, 3, 4, 5 };
2 for (int& x : array)
3 x *= 2;

这样我们可以看到它的大概用法。值得注意的是,这里的循环变量是一个引用,这样可以在循环过程中改变它的值。

 

那么,接下来会有几个疑问。第一,这种for循环的标准形式是什么。第二,这个示例给出的是一个数组的例子。但是类似数组的,还有stl里面的那些容器,在那上面可以用这种表达形式吗?第三,这个示例中for循环中的array是一个数组,也就是是指针常量,那么如果这里array是一个指针变量可以吗?

 

首先,对于第一个问题,它的标准形式如下

for ( for-range-declaration : expression ) statement

for-range-declaration:
     type-specifier-seq attribute-specifieropt declarator
也就是说,for循环中冒号后面的一项是一个表达式。通过查阅前面给出的参考文档,这个表达式应该或者是一个数组,或者是一个拥有begin()和end()方法的对象。

 

对于第二个问题,vector, list之类的stl容器都是可以的。只要是有begin()和end()方法的对象都可以。那么,这么说,我们自己写一个类,有begin()和end()方法都可以吗?当然,这里要求begin()和end()方法返回两个可以比较的对象,并且支持*,++和!=三种操作。

到这里,我们应该写一些代码测试一下。可是,我这里现在只有visual studio 2010,而它有不支持这个特性……只能等回头建立个gcc的环境来测试了。

 

对于第三个问题,答案是不可以的。如果这个参数是数组,则必须要知道它的大小。而一个指针变量是无法知道大小的。在参考文档中是这么写的,If _RangeTis an array of unknown size or an array of incomplete type, the program is ill-formed.


猜你喜欢

转载自blog.csdn.net/haima1998/article/details/80631685