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
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lambda表达式的一般形式如下: ``` [capture list] (parameters) -> return_type { function_body } ``` 其中,`capture list`表示捕获列表,可以是空的,也可以包含一个或多个捕获项;`parameters`表示参数列表,可以为空,也可以包含一个或多个参数;`return_type`表示返回值类型,可以省略,编译器会自动推导;`function_body`表示函数体。 下面是一个Lambda表达式的例子: ```c++ auto lambda = [](int x, int y) -> int { return x + y; }; ``` 这个Lambda表达式定义了一个匿名函数对象,它接受两个整数参数x和y,并返回它们的和。使用`auto`关键字可以自动推导出Lambda表达式的类型。 Lambda表达式还可以通过捕获列表来捕获外部变量,例如: ```c++ int a = 10; auto lambda = [a](int x, int y) -> int { return a + x + y; }; ``` 这个Lambda表达式捕获了变量a,并将其作为常量副本传递给Lambda函数体。在Lambda函数体内,可以使用捕获的变量,但不能修改它。 Lambda表达式还可以省略参数列表和返回值类型,例如: ```c++ auto lambda = [] { cout << "Hello, world!" << endl; }; ``` 这个Lambda表达式不接受任何参数,也不返回任何值,只是输出一条字符串。 Lambda表达式还可以作为函数对象传递给STL算法,例如: ```c++ vector<int> v = {1, 2, 3, 4, 5}; int sum = accumulate(v.begin(), v.end(), 0, [](int x, int y) { return x + y; }); ``` 这个Lambda表达式作为第四个参数传递给`accumulate`函数,用于计算向量`v`中所有元素的和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值