首页 > 编程语言 >C++学习随笔——C++仿函数的应用方法

C++学习随笔——C++仿函数的应用方法

时间:2024-08-27 16:50:25浏览次数:8  
标签:std 随笔 函数 int C++ vec operator include

仿函数的基本定义

仿函数(Functor),也称为函数对象(Function Object),是一个行为像函数的对象。实现仿函数的方法是重载类中的 operator() 操作符,使得对象能够像调用普通函数一样使用。仿函数的主要优势是它们可以拥有状态,并且可以被用于 STL 算法和容器中。

简单例子:

点击查看代码
#include <iostream>

class Adder {
public:
    // 重载 () 操作符
    int operator()(int a, int b) const {
        return a + b;
    }
};

int main() {
    Adder add; // 创建 Adder 对象
    int result = add(3, 4); // 像调用函数一样使用对象
    std::cout << "Result: " << result << std::endl; // 输出 Result: 7
    return 0;
}

用于 STL 算法:

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>

// 定义一个仿函数,用于判断两个整数的大小
class GreaterThan {
public:
    bool operator()(int a, int b) const {
        return a > b;
    }
};

int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9};

    // 使用仿函数 GreaterThan 对 vector 进行降序排序
    std::sort(vec.begin(), vec.end(), GreaterThan());

    // 输出排序后的 vector
    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl; // 输出: 9 5 4 3 1 1

    return 0;
}

保持状态的仿函数:

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>

// 定义一个仿函数,用于计算累计和
class Accumulator {
private:
    int total;
public:
    Accumulator() : total(0) {}

    void operator()(int n) {
        total += n;
    }

    int getTotal() const {
        return total;
    }
};

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    Accumulator acc = std::for_each(vec.begin(), vec.end(), Accumulator());

    std::cout << "Total sum: " << acc.getTotal() << std::endl; // 输出: Total sum: 15

    return 0;
}

参数化的行为:

点击查看代码
#include <iostream>

class Multiply {
private:
    int factor;
public:
    // 构造函数
    Multiply(int f) : factor(f) {}

    // 重载 () 操作符
    int operator()(int x) const {
        return x * factor;
    }
};

int main() {
    Multiply timesTwo(2); // 创建一个乘以2的仿函数
    Multiply timesThree(3); // 创建一个乘以3的仿函数

    std::cout << "2 * 4 = " << timesTwo(4) << std::endl; // 输出 2 * 4 = 8
    std::cout << "3 * 4 = " << timesThree(4) << std::endl; // 输出 3 * 4 = 12

    return 0;
}

标签:std,随笔,函数,int,C++,vec,operator,include
From: https://www.cnblogs.com/kitanoki/p/18383032

相关文章

  • C++入门第一课
    我准备再出一个合集,这个合集主要是讲C++一些知识,主要是因为懒得写洛谷题解(´ー∀ー`),适合新手学习。本人语文不太好,有些用词不太恰当,还请各位多多指正o( ̄︶ ̄)oOK我们现在就开起C++学习吧ヾ(≧▽≦*)o!第一课认识C++要学习C++,就首先要知道C++是什么。1.C++是一种面向对象的计算机程......
  • C++学习笔记——范围基于 for 循环和for_each循环的区别
    范围基于for循环是C++11中引入的,简化了遍历数组或容器的代码点击查看代码#include<iostream>#include<vector>intmain(){std::vector<int>numbers={1,2,3,4,5};//使用范围基于for循环遍历for(intnum:numbers){std::cout<<num......
  • C++学习随笔——关联容器的迭代器失效问题
    常见关联容器的迭代器失效规则std::map和std::set:插入元素:插入新元素不会使任何已有的迭代器失效。你可以在插入新元素后继续使用所有现有的迭代器。删除元素:删除某个元素会导致指向该元素的迭代器失效。除此之外,所有指向其他元素的迭代器仍然有效。如果在遍历过程中删除......
  • 从零开始学习C++之递归
    递归注:此算法与函数有关,如不了解请移步。在wikipedia中,递归的解释是这样的:在C++中,递归就是指在函数中调用函数本身;递归的作用类似于分治,将一个大问题分解为很多小问题进行求解。但是递归的时间复杂度极高,因为要解决很多小问题,所以时间复杂度高达\(O(2^n)\)。使用递......
  • C++/Qt 多媒体(续二)
    一、前言        前边讲述到了Qt的两项独特的模块编程支持的另一项内容——多媒体编程,上篇文章具体讲述的包括一个QMediaPlayer类的示例代码和一个QSoundEffect类的讲解,而本章将会提供一篇示例代码——《基于QMediaRecorder类的音频录制》。    对于上篇内......
  • C++面试基础系列-this指针
    系列文章目录文章目录系列文章目录C++面试基础系列-this指针Overview1.this指针1.1.特性1.2.用法1.3.注意事项2.使用'this'指针的多态类的示例3.在C++中,指针和对象本身有什么区别?关于作者C++面试基础系列-this指针Overview1.this指针在C++中,this指针是一......
  • 仓颉函数调用语法糖
    尾随lambda尾随lambda可以使函数的调用看起来像是语言内置的语法一样,增加语言的可扩展性。当函数最后一个形参是函数类型,并且函数调用对应的实参是lambda时,我们可以使用尾随lambda语法,将lambda放在函数调用的尾部,圆括号外面。例如,下例中我们定义了一个myIf函......
  • c/c++代码流程图生成
    以下介绍2款皆免费1.cxx2flow【github项目】c/c++函数解析为dot然后通过Graphviz渲染项目有附带gui程序可直接生成流程图,但是显示效果缩放不太行,建议解析生成dot后喂给其他基于Graphviz的渲染服务,使用过vscode上面的graphviz-interactive-preview,效果还行,也有在线网页渲染......
  • 【编程规范具体案例(基于Qt、微软、谷歌和AUTOSAR C++14 参考)】 C++ 编码规范 之并发篇
    目录标题并发目录12.并发编程规范12.1线程创建与管理规则12.1.1\[必须]明确定义线程的生命周期管理策略12.1.2\[必须]为关键线程设置明确的标识符12.1.3\[必须]在多线程环境中安全地处理异常12.2线程同步规则12.2.1\[必须]使用线程安......
  • C++与C语言中基础数据类型详解
    目录引言基础数据类型分类实际编程中的应用建议结论引言在C++与C语言的编程世界中,理解并正确使用基础数据类型是每个程序员的必备技能。不同的数据类型在内存中的占用和表示方式直接影响到程序的性能和行为。本文将详细介绍C++与C语言中常见的基础数据类型,探讨它们......