C++11特性

编译

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;
} 
全部评论

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
牛客51274894...:意思是光刷力扣还不够卷
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务