C++ 11 - STL - 函数对象(Function Object) (上)

简介: 1. 定义 在STL中,可以把函数传递给算法,也可以把函数对象传递给算法。 那么,什么是函数对象呢? 我们来看下它的声明: class X { public: // define function call operator return-value operator() (arguments) const; .

1. 定义

在STL中,可以把函数传递给算法,也可以把函数对象传递给算法。

那么,什么是函数对象呢?

我们来看下它的声明:

class X
{
public:
  // define function call operator
  return-value operator() (arguments) const;
  ...
}

你可以这样调用:
X fo;

...

fo(arg1, arg2);

 

我们来看个简单的打印的例子

PrintInt.h

#ifndef        Print_Int_H_
#define        Print_Int_H_

#include <iostream>
using namespace std;
class PrintInt 
{
public:
    void operator() (int elem) const 
    {
        cout << elem << ' ';
    }
};

#endif

 

FuncObjectTest.h

#ifndef        Stl_Alg_Func_Object_Test_H_
#define        Stl_Alg_Func_Object_Test_H_

#include "../../TestBase.h"

class FuncObjectTest : public TestBase
{
public:
    FuncObjectTest(const string &c, const string &d) : TestBase(c, d) { }
    void run();
private:
    void printFuncObject();
};

#endif

 

FuncObjectTest.cpp

#include <vector>
#include <algorithm>
#include <iostream>
#include "FuncObjectTest.h"
#include "../../Core/PrintInt.h"

using namespace std;

void FuncObjectTest::printFuncObject()
{
    vector<int> coll;

    // insert elements from 1 to 9
    for (int i = 1; i <= 9; ++i) {
        coll.push_back(i);
    }

    // print all elements
    for_each(coll.cbegin(), coll.cend(),  // range
        PrintInt());                 // operation
    cout << endl;
}

void FuncObjectTest::run()
{
    printStart("printFuncObject()");
    printFuncObject();
    printEnd("printFuncObject()");
}

 

运行结果:

---------------- printFuncObject(): Run Start ----------------
1 2 3 4 5 6 7 8 9
---------------- printFuncObject(): Run End ----------------

 

目录
相关文章
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
94 6
|
3月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
48 0
|
3月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
41 3
|
3月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
430 1
|
3月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
54 1
|
3月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
72 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
|
3月前
|
JavaScript
箭头函数与普通函数(function)的区别
箭头函数是ES6引入的新特性,与传统函数相比,它有更简洁的语法,且没有自己的this、arguments、super或new.target绑定,而是继承自外层作用域。箭头函数不适用于构造函数,不能使用new关键字调用。
|
3月前
|
数据可视化 开发者 索引
详解Wireshark LUA插件函数:function p_myproto.dissector(buffer, pinfo, tree)
在 Wireshark 中,LUA 插件通过 `function p_myproto.dissector(buffer, pinfo, tree)` 扩展协议解析能力,解析自定义应用层协议。参数 `buffer` 是 `PacketBuffer` 类型,表示原始数据包内容;`pinfo` 是 `ProtoInfo` 类型,包含数据包元信息(如 IP 地址、协议类型等);`tree` 是
101 1