编译

g++  main.cpp -std=c++14

空指针nullptr

node* root = nullptr;

常量表达式constexpr

constexpr int f(const int n){
	if(n == 1) return 1;
	if(n == 2) return 1;
	return f(n-1) + f(n-2);
}
int arr[f(4)+5];

类型推导auto和decltype

auto x = 5;  // int x = 5; 
decltype(x) a; //推导出x的类型,并让a的类型也为x的类型

范围遍历

数组和容器挺好用的

for(auto &it: arr){ //需要修改内容时,加上引用,若只是读取可以不加引用
	cout<<it<<endl;
}

智能指针shared_ptr

用智能指针托管一个指针,当该指针无智能指针托管时,自动释放。
头文件memory

shared_ptr<int> ptr(new int)
ptr.get() 
ptr.reset()

初始化列表initializer_list

变量后面直接大括号,表示给该变量初始化。

int j{}; //j=0
int* p{}; //p = nullptr
int x{5.0}; //不可以窄化

带有初始化器的if语句和switch语句

作用在于限制某个变量的作用域,便于编译器优化程序。
if语句:

if(auto x=f(n); x < 40){
	do sth;
}else{
	do sth with x; //else中也可以继续使用x
}

switch语句:

swich(int x=rand()%100; i){
	case 1:
		do sth;
	default:
		do sth;
}

容器数组array

array保存在栈内存中,提高程序性能
vector保存在堆内存中,而且需要自己负责释放资源

array<int, 4> arr={1,2,3,4};
sort(arr.begin(), arr.end())

无序容器

无序容器中的元素是不进行排序的,内部通过hash表实现,插入和搜索 O ( c o n s t a n t ) O(constant) O(constant)
set/map在原标准中通过红黑树实现,插入和搜索时间复杂度为 O ( l o g n ) O(logn) O(logn)

unordered_map
unordered_set
unordered_multiset
unordered_multimap

元祖tuple

用来存放多个不同类型的数据类型。
两个不同的数据类型用pair

lambda表达式

排序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	vector<int> v{5,7,1,4,3};
	sort(v.begin(), v.end(), [](int x, int y){return x > y;}); 
	for(auto x: v) cout<<x<<endl;
	return 0;
}

传参

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
	string s1 = "hello", s2 = "nihao";
	auto f =[](string s1, string s2){return s1.size() == s2.size();};
	cout<<f(s1,s2)<<endl;
	return 0;
}

隐式捕获

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
	int a = 100, b = 200;
	auto f = [=]{ cout<< a <<" "<<b <<endl;}; //值捕获
	f();
	auto g = [&]{cout<<++a<<endl;}; //引用捕获
	g();
	return 0;
}

外部变量捕获

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
	int a = 100, b = 200;
	auto f = [a]{ cout<< a <<endl;};
	f();
	auto g = [&a]{cout<<++a<<endl;};
	g();
	return 0;
}

修改捕获变量

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    int a = 123;
    auto f = [a]()mutable { cout << ++a; }; // 不会报错
    cout << a << endl; // 输出:123
    f(); // 输出:124
}

C++11多线程

#include<iostream>
#include<thread>
using namespace std;
void f(){
	cout<<"hello wrold"<<endl;
}
void g(){
	for(int i = 0; i < 5; i++) cout<<i<<endl;
}
int main(){
	thread t2(g);
	thread t1(f);
	t2.join();  //等t2执行完成之后再执行t1 
	t1.join();
	return 0;
}