编译
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(constant)
set/map在原标准中通过红黑树实现,插入和搜索时间复杂度为 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;
}