Lambda表达式
lambda表达式类似Javascript中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程
工作。Lambda的语法如下:
[函数对象参数](操作符重载函数参数)->返回值类型{函数体}
vector
iv{5, 4, 3, 2, 1};
int a = 2, b = 1;
for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<
int{return x * (a + b);});//(3)
[]内的参数指的是Lambda表达式可以取得的全局变量。(1)函数中的b就是指函数可以得
到在Lambda表达式外的全局变量,如果在[]中传入=的话,即是可以取得所有的外部变
量,如(2)和(3)Lambda表达式
()内的参数是每次调用函数时传入的参数。
->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变量
变长参数的模板
我们在C++中都用过pair,pair可以使用make_pair构造,构造一个包含两种不同类型的数据的
容器。比如,如下代码:
auto p = make_pair(1, "C++ 11");
由于在C++11中引入了变长参数模板,所以发明了新的数据类型:tuple,tuple是一个N元组,可以传入1个, 2个甚至多个不同类型的数据。
auto t1 = make_tuple(1, 2.0, "C++ 11");
auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});
这样就避免了从前的pair中嵌套pair的丑陋做法,使得代码更加整洁
另一个经常见到的例子是Print函数,在C语言中printf可以传入多个参数,在C++11中,我们可以用变长参数模板实现更简洁的Print
template
void Print(Head head, typename... tail) {
cout<< head <
Print中可以传入多个不同种类的参数,如下:
Print(1, 1.0, "C++11");
更加优雅的初始化方法
在引入C++11之前,只有数组能使用初始化列表,其他容器想要使用初始化列表,只能用以下方法:
int arr[3] = {1, 2, 3}
vector
v(arr, arr + 3);
在C++11中,我们可以使用以下语法来进行替换:
int arr[3]{1, 2, 3};
vector
iv{1, 2, 3};
map
{{1, "a"}, {2, "b"}}; string str{"Hello World"};
此外,智能指针也是挺好用的,一句代码写数据类型几百个字符。但是vs2012不怎么支持c++11,所以要用C++11的建议装vs2013.
不懂的可以加我的QQ群: 239982941(cocos2d-x 3.1.1学习群)