C++11 常用特性总结 1

C++11提供了很多新特性,比如λ、auto、auto_ptr、for_each这些特性,让人感觉更接近脚本语言了。

接下来,将对每个特性做一些常用的方法的总结。

统一初始化

以往很多初始化语句,明显是啰嗦的,让人有一种把初始化写个模板方法的冲动,如下面代码:

1
2
3
4
std::vector<std::map<std::string, std::string>> a;
std::map<std::string, std::string> tmp;
tmp.insert(std::make_pair("1", "2"));
a.push_back(tmp);	// 终于完成初始化了!

现在,只需要一个大括号就解决了:

1
std::vector<std::map<std::string, std::string>> a{ { {"1", "2"} } }

在进行STL的push等操作时,可以直接填写大括号,非常方便:

1
2
vector<pair<string,int>> temp;
temp.push_back({"1", 1});

函数返回时,可以直接通过大括号创建返回对象

1
2
3
vector<int> func() {
	return {1, 2, 3};
}

auto 类型

C++是编译型语言,所以栈上的变量类型一定是编译期确定的。

auto是在预编译期,根据上下文自动确定类型,进行替换后再继续编译,所以并不是脚本语言那种动态类型。

虽然本质还是静态编译型语言,但是auto可以在很多地方增加便利。

在定义一个复杂类型的iterator时,可以简化语句:

1
2
3
4
5
6
7
vector<vector<map<string, int>>> v;

// 以前要这样定义:
vector<vector<map<string, int>>>::iterator iter = v.begin();

// 现在只要这样:
auto iter1 = v.begin();

在for_each语句中也会用到auto,在后面介绍。

※在使用auto时要注意不要滥用,过多使用auto会降低程序的可读性。

for each语句

for each是其他语言都有的语句:

1
2
for (auto i : vector1) {
}

这里auto后边的变量名,是引用类型,可以直接对vector内容进行赋值。