cpp 11&14 decltype&lambdas
- decltype
1
2map<string,float> coll;
decltype(coll)::value_type elem; // map<string,float>::value ele; - lambdas
1
2
3
4
5
6
7
8
9
10
11
12
13//mutable 关键字,表示是否可以改写
//thorwSpec 表示可以抛出的异常
//retType 表示返回值
//三个都没有(parameters)可以不写
// ^
//[] 这个里面可以放外部的变量,不放入就看不见。可以传值和引用
[...](parameters)mutable(opt),thorwSpec(opt)->retType(opt){
...
}
auto i=[...](parameters)mutable(opt),thorwSpec(opt)->retType(opt){
...
}()//表示直接调用
decltype
获取一个表达式的类型
code
1 | map<string,float> coll; |
sample
1 | //**************************************// |
lambdas
是一个对象,但是用起来像一个function
类型是一个匿名的函数对象
code
1 | //mutable 关键字,表示是否可以改写 |
sample
1 | //****************************** |
lambdas的对比
类型1(值传递,mutable)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15int id=0;
auto f=[id]()mutable{
std::cout<<"id:"<<id<<std<<endl;
++id;
}
id=42;
f();
f();
f();
std::cout<<id<<std::endl;
// id:0
// id:1
// id:2
// 42类型2(引用传递)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15int id=0;
auto f=[&id]()mutable{
std::cout<<"id:"<<id<<std<<endl;
++id;
}
id=42;
f();
f();
f();
std::cout<<id<<std::endl;
// id:42
// id:43
// id:44
// 45类型3(默认全部传递,值传递)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15int id=0;
auto f=[=]()mutable{
std::cout<<"id:"<<id<<std<<endl;
++id;
}
id=42;
f();
f();
f();
std::cout<<id<<std::endl;
// id:42
// id:43
// id:44
// 45类型4(值传递) Error
1
2
3
4
5
6
7
8
9
10
11
12
13int id=0;
//编译报错,因为id为只读不可修改
auto f=[id](){
std::cout<<"id:"<<id<<std<<endl;
++id;
}
id=42;
f();
f();
f();
std::cout<<id<<std::endl;
注意
当我们需要知道lambadas表达式的类型时,这种情况主要被应用在传递一个函数作为hash函数或者排序函数或者排序的准则对于一个无序的容器
1 | auto cmp=[](const Person& p1,const Person& p2){ |
原理
1 | template<class Key,class Compare=less<Key>, |