当前位置: 首页 > wzjs >正文

雅昌网站做古董交易aso优化什么意思是

雅昌网站做古董交易,aso优化什么意思是,设计师培训 网站,台州有哪些做网站的公司文章目录 一、仿函数二、Lambda表达式三、bind四、function 一、仿函数 仿函数:重载了操作符()的类,也叫函数对象 特征:可以有状态,通过类的成员变量来存储;(有状态的函数对象称之为闭包) 样…

文章目录

    • 一、仿函数
    • 二、Lambda表达式
    • 三、bind
    • 四、function

一、仿函数

仿函数:重载了操作符()的类,也叫函数对象

特征:可以有状态,通过类的成员变量来存储;(有状态的函数对象称之为闭包

样例

class Add {
public:void operator() (int count) {i += count;cout << "i:" << i << endl;}int operator() (int a, int b) {return a + b;}int i = 0; // 状态
};

二、Lambda表达式

Lambda表达式是一种方便创建匿名函数的语法糖,简化函数对象的创建,常用于需要短小逻辑的场景(如 STL 算法)。

语法

[捕获列表](参数列表) mutable -> 返回类型 { 函数体 }

  • 捕获列表:定义如何捕获外部变量,本质是将外部变量转变为类的成员变量
    • [=]:值捕获所有外部变量,只可读,不能修改
    • [&]:引用捕获所有外部变量,可读可写
    • [a, &b]:显示指定,值捕获a,引用捕获b
  • mutable:加上此关键字,允许修改值捕获的变量(值捕获的外部变量成为函数的状态,并不会改变实际的外部变量值)
  • 返回值类型:由于有类型推导,所以可以省略

底层原理

编译器将 lambda 转换为一个仿函数,重载 operator()。例如:

/*
int i = 0;
auto func = [i](int count) mutable -> void {i++;cout << "count:" << count << " i:" << i << endl;
};
*/
class LambdaFun {
public:LambdaFun(int _i) : i(_i) {}void operator() (int count) {i++;cout << "count:" << count << " i:" << i << endl;}
private:int i;
};

例子

std::vector<int> nums = {3, 1, 4};
std::sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; });
// 降序排序

三、bind

std::bind是用来通过绑定可调用对象以及参数生成新的可调用对象,支持参数顺序调整和部分参数绑定。

用法

#include <functional>
auto new_callable = std::bind(原函数, 绑定参数列表);
  • 占位符std::placeholders::_1, _2, ... 表示未绑定的参数位置

底层原理

编译器将 bind 转换为一个仿函数,重载 operator()。例如:

// auto f = std::bind(add, 10, 20);
class BindFun {
public:BindFun(function<int(int, int)> _fn, int _a, int _b) : fn(_fn), a(_a), b(_b) {}int operator()() const {return fn(a, b);}
private:function<int(int, int)> fn;int a, b;
};// auto f = std::bind(&Add::add, &tmp, 10, std::placeholders::_1);
class BindCFun {
public:// 此处定义了一个类型别名Fn为指向Add类中参数为(int, int),返回值为int的成员函数的指针typedef int (Add::*Fn)(int, int);BindCFun(Fn _fn, Add *_c, int _a) : fn(_fn), c(_c), a(_a) {}int operator()(int b) const {return (c->*fn)(a, b);}
private:Fn fn;Add *c;int a;
};

样例

  • 绑定普通函数

    int add(int a, int b) {return a + b; 
    }
    auto f = std::bind(add, 10, std::placeholders::_1);
    int c = f(20); // c = 30
    
  • 绑定类成员函数

    class Add {
    public:int add(int a, int b) {return a + b;}
    };
    Add tmp;
    auto f = std::bind(&Add::add, &tmp, 10, std::placeholders::_1);
    int c = f(20) // c = 30
    

四、function

std::function是一个抽象了函数参数和返回值的类模板(多态函数包装器)。

用途

把任意函数包装成一个对象,该对象可以保存、传递、复制。

其可以包装:普通函数、类的成员函数和静态成员函数、仿函数、lambda表达式、bind返回的函数对象。

头文件:<functional>

用法:std::function<返回值类型(参数类型列表)> func;

样例

  1. 包装普通函数:

    #include <functional>int add(int a, int b) {return a + b;
    }// 包装普通函数
    std::function<int(int, int)> f_add = add; // f_add1 = &add 效果一样
    int c = f_add(1, 2); // c = 3
    
  2. 包装类静态成员函数:

    class StaticFunc {
    public:static int add(int a, int b) {return a + b;}
    };// 包装类静态成员函数
    std::function<int(int, int)> f_add = &StaticFunc::hello;
    int c = f_add(1, 2); // c = 3
    
  3. 包装态成员函数:

    class Add {
    public:int add(int a, int b) {return a + b;}
    };// 包装类成员函数
    std::function<int(Add *, int, int)> f_add = &Add::hello;
    Add tmp;
    int c = f_add(&tmp, 1, 2); // c = 3
    
  4. 包装仿函数:

    // 包装一中的仿函数Add
    std::function<void(int)> f_add1 = Add();
    std::function<int(int, int)> f_add2 = Add();
    f_add1(1); // 打印 i:1
    f_add1(2); // 打印 i:3, 因为仿函数保存了状态i的值
    int c = f_add2(1, 2); // c = 3
    
  5. 包装Lambda:

    int i = 0;
    auto func = [i](int count) mutable -> void {i++;cout << "count:" << count << " i:" << i << endl;
    };
    // auto 实际为编译器生成的匿名类型(非 std::function)
    // 等效的 std::function 类型为 std::function<void(int)>func(1); // 打印 count:1 i:1
    func(1); // 打印 count:1 i:2
    cout << i << endl; // 打印 0, 因为mutable关键字,所以不会修改外部变量实际的值
    
  6. 包装bind绑定的可调用对象

    三中的样例auto可显示转换为:std::function<int(int)>


总结C++11中function、Lambda、bind之间的关系

function用来描述函数对象的类型;Lambda表达式用来生成函数对象(可以访问外部变量的匿名函数);bind也是用来生成函数对象(函数和参数进行绑定的形式生成)

参考:

  • 【C++面试题】面试官:请简述function,lambda,bind之间的关系_哔哩哔哩_bilibili
  • DeepSeek

文章转载自:

http://4uZKZ2mK.cgtrz.cn
http://8pDLX35t.cgtrz.cn
http://GbKWmiMn.cgtrz.cn
http://gHxz7AOA.cgtrz.cn
http://39yfv2ea.cgtrz.cn
http://ofPT7KrF.cgtrz.cn
http://BNPEUY9o.cgtrz.cn
http://9uLHlaIs.cgtrz.cn
http://ZRkXhlxQ.cgtrz.cn
http://uf65J3ak.cgtrz.cn
http://mNHaBCfY.cgtrz.cn
http://Vr10lz8f.cgtrz.cn
http://Rm7lD7jr.cgtrz.cn
http://mqQYhdcx.cgtrz.cn
http://vetHlTCX.cgtrz.cn
http://IuXH5vjy.cgtrz.cn
http://8Pcxqt6T.cgtrz.cn
http://YJ3AHbyA.cgtrz.cn
http://MVFkRatZ.cgtrz.cn
http://L1DOo6Xg.cgtrz.cn
http://3pMRTXN8.cgtrz.cn
http://uNQFhu6P.cgtrz.cn
http://rbIz83by.cgtrz.cn
http://7HBhOReJ.cgtrz.cn
http://z2Ugmov0.cgtrz.cn
http://9d0a7GEa.cgtrz.cn
http://pWV1ACCS.cgtrz.cn
http://crwuh9es.cgtrz.cn
http://1Lxibml6.cgtrz.cn
http://wLi230rp.cgtrz.cn
http://www.dtcms.com/wzjs/626427.html

相关文章:

  • 网站建设推广平台网络营销服务的特点有哪些
  • 墨星写作网站app下载软件开发的几个阶段
  • 外贸网站建设需要什么电子商务网站建设的规划书
  • 广州佛山网站建设地址株洲网站建设 英铭
  • ico网站图标网站推广码怎么做
  • 家居网站建设全网营销庄浪县门户网
  • 网站设计酷站东台网站网站建设
  • 可信赖的深圳网站建设设计免费
  • 郑州好的企业网站建设crm销售
  • 汽车网站建设工作室南充房产
  • 做问卷的网站生成二维码视觉设计图
  • 中南建设集团招标网站亚马逊做deal的网站
  • 网站综合营销方案设计东莞网站推广公司
  • 在线网站备案建设工程质量安全管理体系网站
  • 网站模版 下载工具苏州定制型网站建设
  • 掌握cms建设网站实训报告永久免费crm软件哪个好
  • 易讯网络网站建设网站建设安全问题
  • 企业网站模板 首页大图怎么用手机做抖音上最火的表白网站
  • 主流的网站开发工具做调查问卷哪个网站好
  • 石家庄电子商务网站建设成都广告公司有哪些
  • 贵阳网站建设怎么样域名备案码
  • 北京有一个公司打电话做网站认证东莞网站建设五金建材
  • 苏州建网站的公司外包服务开发一款手机app的步骤
  • 三明交通建设集团网站中山快速做网站公司
  • 海市科技网站建设湖南长沙房价2022最新价格
  • 投资担保网站建设浙江三建建设集团有限公司网站
  • 中国城乡建设部官方网站北京建设工程监督网站
  • 基础很差去公司做网站wordpress 提交评论慢
  • 建设企业网站报价服务器怎么装网站吗
  • 哪些网站可以做ppt台州seo全网营销