1. C++ 11的特性
C++ 0x 扩展了 STL 并入了大部分 C++ TR1程序库
A. lamda表达式
语法如下:
[函数对象参数](操作符重载函数参数)->返回值类型{函数体}
e.g:
vector<int> iv{5, 4, 3, 2, 1};
int a = 2, b = 1;
for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<<endl;}); // (1)
for_each(iv.begin(), iv.end(), [=](int &x){x *= (a + b);}); // (2)
for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});// (3)
说明:
---- []内的参数指的是Lambda表达式可以取得的全局变量 --> (1)(2)(3)
若在[]中传入=的话,即是可以取得所有的外部变量 --> (2)(3)
---- ()内的参数是每次调用函数时传入的参数
-> 后加上的是lamda表达式的返回值类型
B. 类型推导auto
自动类型推导:从初始化表达式中推导出变量的数据类型
实质上是在编译时对类型进行推导 不会影响程序的运行效率
同样也不会影响编译速度
e.g:
auto a;// error 没有初始化表达式
template <typename T1, typename T2>
void doSomething(const T2& t)
{
T1* t1 = t.fun();
}
使用auto可以简化上述代码[不需要提供模板参数]
template <typename T2>
void doSomething(const T2& t)
{
auto t1 = t.fun();
}
C. decltype
类似auto的相反功能 从一个变量或者表达式中获取类型
e.g:
int a = 1;
decltype(a) b = a;
template <typename T2>
auto doSomething(const T2& t) -> decltype(t.fun())
{
auto t1 = t.fun();
}
D. 模板的改进
变长参数的模板
改进前:
用make_pair()构造pair
如:auto p = make_pair(1, "C++ 11");
改进后:
用make_tuple构造 可以传入N个不同类型的数据
如:
auto t1 = make_tuple(1, 2.0, "C++ 11");
auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});
E. nullptr
nullptr的引入是为了解决C++中NULL的二义性问题。
C++ 0x 扩展了 STL 并入了大部分 C++ TR1程序库
A. lamda表达式
语法如下:
[函数对象参数](操作符重载函数参数)->返回值类型{函数体}
e.g:
vector<int> iv{5, 4, 3, 2, 1};
int a = 2, b = 1;
for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<<endl;}); // (1)
for_each(iv.begin(), iv.end(), [=](int &x){x *= (a + b);}); // (2)
for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});// (3)
说明:
---- []内的参数指的是Lambda表达式可以取得的全局变量 --> (1)(2)(3)
若在[]中传入=的话,即是可以取得所有的外部变量 --> (2)(3)
---- ()内的参数是每次调用函数时传入的参数
-> 后加上的是lamda表达式的返回值类型
B. 类型推导auto
自动类型推导:从初始化表达式中推导出变量的数据类型
实质上是在编译时对类型进行推导 不会影响程序的运行效率
同样也不会影响编译速度
e.g:
auto a;// error 没有初始化表达式
template <typename T1, typename T2>
void doSomething(const T2& t)
{
T1* t1 = t.fun();
}
使用auto可以简化上述代码[不需要提供模板参数]
template <typename T2>
void doSomething(const T2& t)
{
auto t1 = t.fun();
}
C. decltype
类似auto的相反功能 从一个变量或者表达式中获取类型
e.g:
int a = 1;
decltype(a) b = a;
template <typename T2>
auto doSomething(const T2& t) -> decltype(t.fun())
{
auto t1 = t.fun();
}
D. 模板的改进
变长参数的模板
改进前:
用make_pair()构造pair
如:auto p = make_pair(1, "C++ 11");
改进后:
用make_tuple构造 可以传入N个不同类型的数据
如:
auto t1 = make_tuple(1, 2.0, "C++ 11");
auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});
E. nullptr
nullptr的引入是为了解决C++中NULL的二义性问题。