c++11新语言特性梳理(这里整理算法书上的内容,方便日后复习)
1、类型推导(auto)
这个不用多说,c++11提供了不需要预先知道变量类型时,即可定义变量的方式:auto关键字。其实我认为一般在明确知道变量类型时,不用偷懒还是用确定的变量类型定义即可,一般auto用在不知道变量类型或者是声明迭代器变量时:
vector<int> vec;
vector<int> vec::iterator iter = vec.begin();
auto iterNew = vec.begin();
vector<int> vec2 = {1,2,3};
auto& iter2 = vec[1];
iter2 += 1; // vec2 = {1,3,3}
2、空指针(nullptr)
之前都用NULL表示空指针,实际上NULL与0是等价的,这样有时字符变量与整型变量容易混淆导致错误,c++11用专门的空指针数据类型:nullptr。
这个混淆主要是发生在参数重载过程中,传入空指针到底是用参数为int的函数还是参数为char*的函数呢?
3、容器的for循环遍历
这个就记住这种格式吧:
for(const auto& x : vec){
cout << x << '\t';
}
4、匿名函数(lambda表达式)
匿名函数是及其重要的改进,是函数式编程风格的基石,简单地说就是可以在需要的地方定义函数,而不是一定要提前定义好。
using namespace std;
#define _for(i,a,b) for(int i=(a); i<(b); i++)
const int N = 1000000000;
struct TS{
int a,b,c;
};
TS tss[N]
void genData(){
_for(i,0,N){
tss[i].a = rand();
tss[i].b = rand();
tss[i].c = rand();
}
}
int main(){
genData();
//重点来啦:
//[]内可以扑捉外部变量
//()内为参数列表
sort(tss, tss+N, [](const TS& t1, const TS& t2){
if(t1.a != t2.a) return t1.a < t2.a;
if(t1.b != t1.b) return t1.b < t2.b;
else
return t1.c < t2.c;
});
return 0;
}
哈希容器
之前我们经常用到map容器和multimap容器,其都是基于二叉树实现的,在数据量较大时查询时间复杂度为O(logn),并无法达到标准的hash算法的速度,C++正式引入了几个基于Hash算法的容器:unordered_map, unordered_set, unordered_multimap 和 unordered_multiset。当不需要元素排序时可以尽量使用这些容器获得更好的查找性能。