(原创)C++11改进我们的程序之简化我们的程序(四)
这次要讲的是:c++11统一初始化、统一begin()/end()和for-loop循环如何简化我们的程序
- 初始化列表
c++11之前有各种各样的初始化语法,有时候初始化的时候还挺麻烦,比较典型的如vector和map的初始化。
vector<int> v; for(int i=0;i<10;i++) { v.push_back(i); } map<int,int> map; for(int i=0;i<10;i++) { map.insert(make_pair(i,i)); }
这种写法比较繁琐,而且不够直观。现在c++11中你可以这样写了:
vector<int> v = {0,1,2,3,4,5,6,7,8,9}; map<int,int> map = {{0,0},{1,1},{2,2,{3,3}};
不用再手动去push_back或者insert了,这样写很简单也很直观。不仅仅是容器的初始化可以这样,普通的数组也可以这样写:
int int_array[3] = {1,2,3}; string str_array[3] = {"","",""};
其实对结构体和类也一样可以很方便的初始化,例如:
struct A { int x; int y; };
vector<A> v在c++11之前如果要放入两个结构体A的话,要这样写:
A a1; a1.x = 1; a1.y = 2; v.push_back(a1); A a2; a2.x = 1; a2.y = 2; v.push_back(a2);
vector<A>的初始化显得十分繁琐,现在c++11让我们从这种繁琐之中解脱出来了,c++11中可以这样写:
vector<A> v = {{1,2},{3,4}};
上面的代码表示v中有两个结构体A,内部成员变量x,y的初始化值为1,2以及3,4;一行代码,一步到位,简洁明了,是不是很清爽,我非常喜欢这种简洁而直接的初始化方式。
- 统一的begin()/end()
c++11之前只有容器有自己的begin()和end(),我们可以很方便的按照统一的方式去遍历集合,然而一些其他类型的数组没有却没有begin()/end()导致我们不能按照统一的方式去遍历集合。
vevtor<int> v; for(auto it=v.begin(); it!=v.end(); ++it) { //do something } int array[10];
对于array我们却不能像vector那样去遍历。
现在c++11增加了非成员的begin()和end(), 就是说这个begin()和end()不是属于某个类型的,而是所有集合和数组所共有的,使得我们可以按照统一的方式去遍历集合和数组了。你可以一种通用方式去遍历,类似于:
for(auto it = begin(range); it!=end(range); it++) { //do something }
这个range可以vecotr,map等容器,也可以是int类型的普通数组,这样我们就可以统一的方式去遍历容器和数组了,可以写出更加泛化和通用的代码了。
- for-loop循环
c++11新增了for-loop循环方式,上面遍历容器的方法还可以写成:
for(auto item : range) { } for(auto& item : range) { }
这种方式直接获取range中的元素,可以以值或者引用方式获取。这种方式比起之前的写法要更简洁了。这种for-loop写法不仅仅对容器和数组有效,对自定义类型同样有效,不过前提是自定义类型要实现begin(),end(),因为for-loop内部实现就是通过begin(),end()去迭代整个范围的。
初始化列表和for-loop循环在c#和java中比较早就引入了,现在c++也赶上来了,c++11引入这些现代编程语言的特性,让我们的代码变得更简洁、更modern。
posted on 2013-09-03 22:16 qicosmos(江南) 阅读(2438) 评论(4) 编辑 收藏 举报