C++之STL(九)

news2024/11/17 5:03:14

1、函数对象

什么适合推荐使用函数对象?

需要状态的函数调用:

  • 需要状态的函数调用:
    • 函数对象可以包含成员变量,可以在多次调用中保持状态。这在某些算法中非常有用。
  • 提高性能:

    • 编译器可以更好地优化函数对象,因为它们是具体的类型,而不是函数指针或 std::function,这减少了间接调用的开销。
    • 内联(inline)函数对象的调用可以减少函数调用的开销。
  • 灵活的接口:
    • 函数对象可以有多个重载或模板版本,以适应不同的调用场景。
    • 可以使用模板参数来创建更通用和高效的代码。
  • 用于标准库算法:

    • 标准模板库(STL)的算法,如 std::sort, std::find_if, std::for_each 等,通常需要一个可调用对象作为参数。使用函数对象可以方便地传递复杂的行为。

2、自定义函数对象

第二个()为参数

#include <iostream>
using namespace std;

class FunObj
{
public:
    void operator()()
    {
        std::cout << "Hello, World!" << std::endl;
    }

    void operator()(int n)
    {
        std::cout << n << std::endl;
    }
};

int main() {
    FunObj fo;
    fo();
    fo(1);

    // 也可以构造匿名对象FunObj()
    FunObj()();
    return 0;
}

// 输出
Hello, World!
1
Hello, World!

3、函数对象与容器

#include <iostream>
using namespace std;

#include <map>

int main() {
    map<int, string> mapTest;
    mapTest.insert(map<int, string>::value_type(1, "aaaa"));
    mapTest.insert(map<int, string>::value_type(3, "cccc"));
    mapTest.insert(map<int, string>::value_type(2, "bbbb"));

    for(map<int, string>::const_iterator it = mapTest.begin(); it != mapTest.end(); ++it)
    {
        cout << it->first << "  " << it->second << endl;
    }
    return 0;
}

// 输出
1  aaaa
2  bbbb
3  cccc

从代码中可以看到,是即使我们先插入3,然后再插入2,打印出来却是按照顺序,这是因为map是一个类模板,模板中的第三个参数less是一个结构体,也就是类,里面是一个函数对象,也就是调用这个函数对象来进行比较大小。

  template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
	    typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
    class map
    { ...}

// less定义
  template<typename _Tp>
    struct less : public binary_function<_Tp, _Tp, bool>
    {
      _GLIBCXX14_CONSTEXPR
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x < __y; }
    };

当然我们也可以用本生提供的greater<>来进行从大到小排序

#include <iostream>
using namespace std;

#include <map>

int main() {
    map<int, string, greater<int>> mapTest;
    mapTest.insert(map<int, string>::value_type(1, "aaaa"));
    mapTest.insert(map<int, string>::value_type(3, "cccc"));
    mapTest.insert(map<int, string>::value_type(2, "bbbb"));

    for(map<int, string, greater<int>>::const_iterator it = mapTest.begin(); it != mapTest.end(); ++it)
    {
        cout << it->first << "  " << it->second << endl;
    }
    return 0;
}

// 输出
3  cccc
2  bbbb
1  aaaa

当然我们也可以自己提供函数对象

#include <iostream>
using namespace std;

#include <map>

struct MyGreater
{
    bool operator()(int left, int right) const
    {
        return left > right;
    }
};
int main() {
    map<int, string, MyGreater> mapTest;
    mapTest.insert(map<int, string>::value_type(1, "aaaa"));
    mapTest.insert(map<int, string>::value_type(3, "cccc"));
    mapTest.insert(map<int, string>::value_type(2, "bbbb"));

    for(map<int, string, MyGreater>::const_iterator it = mapTest.begin(); it != mapTest.end(); ++it)
    {
        cout << it->first << "  " << it->second << endl;
    }
    return 0;
}

// 输出
3  cccc
2  bbbb
1  aaaa

4、函数对象与算法

#include <iostream>
using namespace std;

#include <map>
#include <vector>
#include <algorithm>

void PrintFun(int n)
{
    cout << n << ' ';
}

class printObj
{
public:
    void operator()(int n)
    {
        cout << n << ' ';
    }
};

void add3(int& n)
{
    n += 3;
}

// 函数对象可以记录状态
class addObj
{
public:
    addObj(int num) : num_(num)
    {

    }
    void operator()(int& n)
    {
        n += num_;
    }
private:
    int num_;
};

class greaterObj
{
public:
    greaterObj(int num) : num_(num)
    {

    }
    bool operator()(int n)
    {
        return n > num_;
    }
private:
    int num_;
};
int main() {
    int a[] = {1, 2, 3, 4, 5};
    vector<int> v(a, a + 5);

    for_each(v.begin(), v.end(), PrintFun);
    cout << endl;

    // PrintFun也可以用函数对象实现
    for_each(v.begin(), v.end(), printObj());
    cout << endl;

    for_each(v.begin(), v.end(), add3);
    for_each(v.begin(), v.end(), PrintFun);
    cout << endl;

    // add3也可以用函数对象实现
    for_each(v.begin(), v.end(), addObj(10));
    for_each(v.begin(), v.end(), PrintFun);
    cout << endl;

    // 用count_if找到比n大的个数
    cout << count_if(a, a + 5, greaterObj(3)) << endl;
    return 0;
}

// 输出
1 2 3 4 5
1 2 3 4 5
4 5 6 7 8
14 15 16 17 18
2

5、STL中内置的函数对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1867970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Redis]主从模式

启动主从复制 由于我们只有一台机器&#xff0c;所以我们只能在机器上开多个redis程序来演示不同的机器 因为一个端口号只能被一个进程绑定&#xff0c;所以我们需要修改配置&#xff0c;绑定不同的端口号&#xff0c;并且还要修改工作目录&#xff08;数据持久化的位置&#…

ChatTTS源码部署

感谢阅读 默认已完成的操作准备工作下载源码安装依赖下载补丁(报错在运行) 界面展示(discord上有各种补丁&#xff0c;我的加了UI补丁和音色增强)提示词常用&#xff08;这个每个音基本都能生效&#xff09;语调类语速类情感类 默认已完成的操作 python版本>3.9 cuda版本的…

3D渲染时如何提高GPU的使用率?这7点告诉你

GPU 正逐渐取代 CPU 在 3D 渲染中的地位。我们看到许多 GPU 渲染器如 Redshift、Octane、FStorm 等不断推出。以前只支持 CPU 渲染的渲染器&#xff0c;如 Arnold、V-Ray、Renderman、Keyshot 等&#xff0c;现在也开始支持 GPU 渲染。实时渲染的发展使 GPU 更受欢迎&#xff0…

梗图生成器突然爆红;ElevenLabs发布IOS APP 高质量语音朗读手机各种文本内容;开源工作流架构ControlFlow

✨ 1: 梗图生成器 fabianstelzer 在Glif做的一个超强meme生成器 Glif 是一个工作流&#xff0c;能生成文字图片和视频&#xff0c;用工作流的形式可以完成很多的花样来。 最近爆红的梗图生成器&#xff0c;WOJAK MEME GENERATOR &#xff0c;也是用工作流的形式来生成这些有…

TiDB-从0到1-数据导出导入

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容 一、数据导出 TiDB中通过Dumpling来实现数据导出&#xff0c;与MySQL中的mysqldump类似&#xff0c;其属于…

如何选择适合你的免费电子合同软件?八款工具深度对比

主流的8款免费合同软件包括&#xff1a;国内的e签宝、法大大、上上签、契约锁&#xff0c;以及国外的SignWell、PandaDoc、Signaturely、HelloSign和SignRequest。 随着技术的进步&#xff0c;尤其是区块链技术的应用&#xff0c;电子合同的安全性和可信度正在逐渐增强。这些技…

如何提取mac app中的应用程序图标 x.app图标位置

在macos系统中安装的应用程序 .app的图标都是 以 .icns结尾的&#xff0c;默认位于 .app应用程序包中的Contents/Resources/目录下&#xff0c;只要是在这个目录下的 .icns文件就是这个应用的图标&#xff0c;如&#xff1a;mac版微信的图标就是 /Applications/WeChat.app/Co…

5个顶级开源Agent框架,你必须知道!

进入2024年&#xff0c;人工智能的发展已经达到了前所未有的高度&#xff0c;尤其是在Agent框架这一领域&#xff0c;出现了几个引人注目的技术成果。这些框架在智能规划、用户体验增强、记忆处理、以及大型模型调用等方面有着卓越表现&#xff0c;对AI界的未来发展提供了值得期…

利用多模态大模型,构建自动驾驶场景检索解决方案 | 创新场景

ITValue 痛点 在自动驾驶数据闭环的业务场景中&#xff0c;企业面临的挑战是难以高效的从PB级的视频和图片中选取有价值的数据&#xff0c;以训练和优化自动驾驶算法。 解决方案 为解决该挑战&#xff0c;亚马逊云科技利用大语言模型和图像文本多模态嵌入空间架构&#xff0c;构…

CY5-NHS生物标记应用146368-14-1

在生物科学研究和技术应用领域&#xff0c;荧光标记技术已成为一种科研工具。其中&#xff0c;CY5-NHS以其荧光特性和标记能力&#xff0c;在生物标记应用中扮演着科研角色。 CY5-NHS的特性与优势 CY5-NHS是一种荧光标记试剂&#xff0c;其荧光基团CY5赋予其强烈的荧光信号和…

【vue3】【vant】 移动本草纲目案例发布收藏项目源码

更多项目点击&#x1f446;&#x1f446;&#x1f446;完整项目成品专栏 【vue3】【vant】 移动本草纲目案例发布收藏项目源码 获取源码方式项目说明&#xff1a;其中功能包括 项目包含&#xff1a;项目运行环境文件截图 获取源码方式 加Q群&#xff1a;632562109项目说明&am…

flink的窗口

目录 窗口分类 1.按照驱动类型分类 1. 时间窗口&#xff08;Time window&#xff09; 2.计数窗口&#xff08;Count window&#xff09; 2.按照窗口分配数据的规则分类 窗口API分类 API调用 窗口分配器器&#xff1a; 窗口函数 增量聚合函数&#xff1a; 全窗口函数…

llamafactory-llama3微调中文数据集

一、定义 https://github.com/SmartFlowAI/Llama3-Tutorial/tree/main 基准模型测试opencompass 离线测评数据准备微调训练合并测试人工审核对比 二、实现 基准模型测试 基准模型 llama3-8b https://zhuanlan.zhihu.com/p/694818596? https://github.com/SmartFlowAI/Llam…

什么样的台灯适合学生使用?五款暑假必入护眼大路灯分享

什么样的台灯适合学生使用&#xff1f;现在近视越来越低龄化&#xff0c;戴眼镜的小朋友越来越多&#xff0c;每每看着自己孩子眼睛贴到作业本上写作业&#xff0c;我的心都会提到嗓子眼。去医院一检查&#xff0c;果然&#xff0c;远视储备即将告罄&#xff0c;必须要防护了&a…

深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径

文章目录 一、分批渲染1、setTimeout定时器分批渲染2、使用requestAnimationFrame()改进渲染2.1、什么是requestAnimationFrame2.2、为什么使用requestAnimationFrame而不是setTimeout或setInterval2.3、requestAnimationFrame的优势和适用场景 二、滚动触底加载数据三、Elemen…

【项目实训】解决前后端跨域问题

由于前端框架使用vue&#xff0c;后端使用flask&#xff0c;因此需要解决前后端通信问题 在vue.config.js中修改 module.exports defineConfig({transpileDependencies: true,lintOnSave:false, }) // 跨域配置 module.exports {devServer: { //记住&#x…

2024 年适用于 Windows 11/10/8/7 的最佳 SSD 磁盘克隆软件

磁盘克隆软件对于用户在发生数据灾难时保证数据/系统安全至关重要。克隆软件可以创建驱动器的副本并保持数据相同。如果发生数据灾难&#xff0c;您可以设置克隆驱动器以克隆回数据/驱动器。或者您可以直接使用克隆的驱动器继续工作。 除了传统的 HDD&#xff0c;Windows 11/1…

使用nvm切换node版本时报错:exit status 1解决办法

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

C++学习/复习20--继承的权限/向上转换/重定义/默认成员函数/友元/静态成员/菱形虚拟继承/组合

一、继承的概念 二、继承的权限 三、向上转换 四、重定义(隐藏) 五、派生类的默认成员函数 六、继承与友元 七、继承与静态成员 八、菱形继承 数据冗余与二义性 虚拟继承(virtual) 九、继承组合

【ARM】MCU和SOC的区别

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解SOC芯片和MCU芯片的区别 2、 问题场景 用于了解SOC芯片和MCU芯片的区别&#xff0c;内部结构上的区别。 3、软硬件环境 1&#xff09;、软件版本&#xff1a;无 2&#xff09;、电脑环境&#xff1a;无 3&am…