1、统一的初始化方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int arr[3]{1, 2, 3}; vector<int> iv{1, 2, 3}; map<int, string> mp{{1, "a"}, {2, "b"}}; string str{"Hello World"}; int * p = new int[20]{1,2,3}; struct A { int i,j; A(int m,int n):i(m),j(n) { } }; A func (int m,int n ) { return {m,n}; } int main() { A * pa = new A {3,7}; }
2、成员变量默认初始值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class B { public: int m = 1234; int n; }; int main() { B b ; cout << b.m << endl; //输出 1234 return 0; }
3、auto 关键字
4、decltype关键字
求表达式的类型
int i; double t; struct A { double x; }; const A* a = new A(); decltype(a) x1; // x1 is A * decltype(i) x2; // x2 is int decltype(a->x) x3; // x3 is double decltype((a->x)) x4 = t; // x4 is double&
5、智能指针shared_ptr
头文件<memory>
通过shared_ptr的构造函数,可以让shared_ptr对象托管一个new运算符返回的指针。
shared_ptr<T> ptr(new T); // T 可以是 int ,char, 类名等各种类型
此后ptr就可以像 T* 类型的指针一样来使用,即 *ptr 就是用new动态分配的那个对象,而且不必操心释放内存的事。
多个shared_ptr对象可以同时托管一个指针,系统会维护一个托管计数。当无shared_ptr托管该指针时,delete该指针。
shared_ptr对象不能托管指向动态分配的数组的指针,否则程序运行会出错。
6、空指针nullptr
7、基于范围的for循环
#include <iostream> #include <vector> using namespace std; struct A { int n; A(int i):n(i) { } }; int main() { int ary[] = {1,2,3,4,5}; for(int & e: ary) e*= 10; for(int e : ary) cout << e << ","; cout << endl; vector<A> st(ary,ary+5); for( auto & it: st) it.n *= 10; for( A it: st) cout << it.n << ","; return 0; }
8、右值引用和move语义
右值:一般来说,不能取地址的表达式就是右值, 能取地址的就是左值。主要目的是提高程序运行的效率,减少需要进行深拷贝的对象进行深拷贝的次数。
class A { }; A & r = A(); // error , A()是无名变量,是右值 A && r = A(); //ok, r 是右值引用
9、无序容器(哈希表)
头文件<unordered_map>
使用方法与map相同。哈希表插入和查询的时间复杂度几乎是常数。
10、正则表达式
头文件 <regex>
#include <iostream> #include <regex> //使用正则表达式须包含此文件 using namespace std; int main() { regex reg("b.?p.*k"); cout << regex_match("bopggk",reg) <<endl; //输出 1, 表示匹配成功 cout << regex_match("boopgggk",reg) <<endl; //输出 0, 表示匹配失败 cout << regex_match("b pk",reg) <<endl; //输出 1, 表示匹配成功 regex reg2("\d{3}([a-zA-Z]+).(\d{2}|N/A)\s\1"); string correct="123Hello N/A Hello"; string incorrect="123Hello 12 hello"; cout << regex_match(correct,reg2) <<endl; //输出 1, 表示匹配成功 cout << regex_match(incorrect,reg2) << endl; //输出 0, 表示匹配失败 }
11、Lambda表达式
只使用一次的函数对象,不用专门为其写一个类。只调用一次的简单函数,在调用时再写函数体。
形式:
[外部变量访问方式说明符](参数表) ->返回值类型
{
语句组
}
[=] 以传值的形式使用所有外部变量
[] 不使用任何外部变量
[&] 以引用形式使用所有外部变量
[x, &y] x 以传值形式使用,y 以引用形式使用
[=,&x,&y] x,y 以引用形式使用,其余变量以传值形式使用
[&,x,y] x,y 以传值的形式使用,其余变量以引用形式使用
“->返回值类型”也可以没有, 没有则编译器自动判断返回值类型。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int main() { int x = 100,y=200,z=300; cout << [ ](double a,double b) { return a + b; } (1.2,2.5) << endl; auto ff = [=,&y,&z](int n) { cout <<x << endl; y++; z++; return n*n; }; cout << ff(15) << endl; cout << y << "," << z << endl; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int a[4] = { 4,2,11,33}; sort(a,a+4,[ ](int x,int y)->bool { return x%10 < y%10; }); for_each(a,a+4,[ ](int x) {cout << x << " " ;} ) ;