1、统一的初始化方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
int arr[3]{ 1, 2, 3};vector iv{ 1, 2, 3};mapmp{ { 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)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
class B {public:int m = 1234;int n;};int main() {B b;cout << b.m << endl; //输出 1234return 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 intdecltype(a->x) x3; // x3 is doubledecltype((a->x)) x4 = t; // x4 is double&
5、智能指针shared_ptr
头文件<memory>
通过shared_ptr的构造函数,可以让shared_ptr对象托管一个new运算符返回的指针。
shared_ptrptr(new T); // T 可以是 int ,char, 类名等各种类型
此后ptr就可以像 T* 类型的指针一样来使用,即 *ptr 就是用new动态分配的那个对象,而且不必操心释放内存的事。
多个shared_ptr对象可以同时托管一个指针,系统会维护一个托管计数。当无shared_ptr托管该指针时,delete该指针。
shared_ptr对象不能托管指向动态分配的数组的指针,否则程序运行会出错。
6、空指针nullptr
7、基于范围的for循环
#include#include 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 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#include //使用正则表达式须包含此文件using namespace std;int main(){ regex reg("b.?p.*k"); cout << regex_match("bopggk",reg) <
11、Lambda表达式
只使用一次的函数对象,不用专门为其写一个类。只调用一次的简单函数,在调用时再写函数体。
形式:
[外部变量访问方式说明符](参数表) ->返回值类型{ 语句组}
[=] 以传值的形式使用所有外部变量
[] 不使用任何外部变量[&] 以引用形式使用所有外部变量[x, &y] x 以传值形式使用,y 以引用形式使用[=,&x,&y] x,y 以引用形式使用,其余变量以传值形式使用[&,x,y] x,y 以传值的形式使用,其余变量以引用形式使用“->返回值类型”也可以没有, 没有则编译器自动判断返回值类型。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.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 <<< endl;y++; z++;return n*n;};cout << ff(15) << endl;cout << y << "," << z << endl;}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.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 << " " ;} ) ;