1、统一的初始化方法

C++11新特性 随笔 第1张
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、成员变量默认初始值

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。 C++11新特性 随笔 第3张
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 以传值的形式使用,其余变量以引用形式使用

“->返回值类型”也可以没有, 没有则编译器自动判断返回值类型。

C++11新特性 随笔 第5张
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;
}
Lambda实例 C++11新特性 随笔 第7张
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 << " " ;} ) ;
Lambda实例&
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄