c++ auto与function用法
Posted bitcarmanlee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ auto与function用法相关的知识,希望对你有一定的参考价值。
1.auto关键字的用法
auto是c++中的关键字,主要用法有两条,第一条就是根据初始化表达式自动推断该变量的类型。
void f2()
auto a = 1;
auto b = 1.0;
auto c = "abc";
cout<<typeid(a).name()<<endl;
cout<<typeid(b).name()<<endl;
cout<<typeid(c).name()<<endl;
上面代码的输出如下
i
d
PKc
上面的代码可以正常运行没有问题,但是我们一般不这么作,因为上面的这些变量都是比较简单的类型,完全可以直接写出真正的类型。
再看下面的例子。
void f1()
map<int, string> mymap;
mymap[1] = "a";
mymap.insert(make_pair(3, "c"));
mymap.insert(map<int, string>::value_type(2, "b"));
mymap[4] = "d";
map<int, string>::iterator iter;
for(iter=mymap.begin(); iter!=mymap.end(); iter++)
cout<<iter->first<<": "<<iter->second<<endl;
cout<<endl;
for(auto iter: mymap)
cout<<iter.first<<": "<<iter.second<<endl;
1: a
2: b
3: c
4: d
1: a
2: b
3: c
4: d
auto真正比较常见的用处是上面这种场景。iter的类型比较复杂冗长,而且就会在遍历map的时候使用,我们直接用auto声明会使程序更加简洁明了,效果也完全一致。
2.auto声明函数时函数返回值的占位符
auto还可以保存函数表达式类型的变量声明。
void f2()
auto p = [](int x) return x*x;;
int result = p(2);
cout<<"result is: "<<result<<endl;
std::function<int(int)> f2 = [](int x) return x*x;;
int f2result = f2(2);
cout<<"f2result is: "<<f2result<<endl;
int main(int argc, char const *argv[])
f2();
return 0;
上面代码返回结果
result is: 4
f2result is: 4
从上面两点不难看出, auto最大的好处在于,当初始化表达式为复杂类型变量声明时,auto能使代码更加简洁。
3.function用法
std::function的实例可以对任何可以调用的目标对象进行存储、复制和调用操作,而函数指针只能指向一种类型的函数,并且函数指针也是类型不安全的。
可调用对象(callable object)包括以下类型:
1.函数
2.函数指针
3.lambda表达式
4.函数对象,仿函数
5.bind创建的对象
对于std::function最简单明了的理解是:function实现了函数的存储,即先将可调用实体保存起来,在需要的时候再调用。
#include<iostream>
#include<functional>
using namespace std;
int testfunc(int a, int b)
return a+b;
auto exps = [](int a, int b) return a+b;;
class MyFunctor
public:
int operator()(int a, int b)
return a+b;
;
class MyClass
public:
int memberFun(int a, int b) return a+b;
static int staticMemberFun(int a, int b) return a+b;
;
void f1()
function<int(int, int)> func = testfunc;
int result = func(1, 2);
cout<<"result is: "<<result<<endl;
func = &testfunc;
int result2 = func(2, 3);
cout<<"result2 is: "<<result2<<endl;
func = exps;
int result3 = func(4, 5);
cout<<"result3 is: "<<result3<<endl;
MyFunctor functor;
func = functor;
int result4 = func(6, 7);
cout<<"result4 is: "<<result4<<endl;
MyClass objclass;
func = bind(&MyClass::memberFun, objclass, std::placeholders::_1, std::placeholders::_2);
int result5 = func(8, 9);
cout<<"result5 is: "<<result5<<endl;
func = MyClass::staticMemberFun;
int result6 = func(10, 11);
cout<<"result6 is: "<<result6<<endl;
;
int main(int argc, char const *argv[])
f1();
return 0;
result is: 3
result2 is: 5
result3 is: 9
result4 is: 13
result5 is: 17
result6 is: 21
以上是关于c++ auto与function用法的主要内容,如果未能解决你的问题,请参考以下文章
C++ 优先队列 堆 priority_queue的使用 以及内部使用结构化pair的排序的用法 auto在其中的用法(结构化绑定 C++17以上)