gpt4 book ai didi

c++ - 什么是 C++ 仿函数及其用途?

转载 作者:太空宇宙 更新时间:2023-11-04 13:48:31 25 4
gpt4 key购买 nike

我一直听到很多关于 C++ 中的仿函数的信息。谁能给我一个关于它们是什么以及它们在什么情况下有用的概述?

最佳答案

仿函数几乎只是一个定义operator() 的类。这使您可以创建“看起来像”函数的对象:

// this is a functor
struct add_x {
add_x(int val) : x(val) {} // Constructor
int operator()(int y) const { return x + y; }

private:
int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1));
assert(out[i] == in[i] + 1); // for all i

仿函数有一些优点。一是与常规函数不同,它们可以包含状态。上面的示例创建了一个函数,它将 42 添加到您提供的任何内容中。但是这个值 42 不是硬编码的,它在我们创建仿函数实例时被指定为构造函数参数。我可以创建另一个加法器,它加了 27,只需用不同的值调用构造函数即可。这使得它们可以很好地定制。

如最后几行所示,您经常将仿函数作为参数传递给其他函数,例如 std::transform 或其他标准库算法。你可以用一个普通的函数指针做同样的事情,除了,正如我上面所说的,仿函数可以被“定制”,因为它们包含状态,使它们更灵活(如果我想使用一个函数指针,我必须写一个函数它恰好将 1 添加到它的参数中。仿函数是通用的,并且添加你初始化它的任何东西),并且它们也可能更有效。在上面的示例中,编译器确切地知道 std::transform 应该调用哪个函数。它应该调用 add_x::operator()。这意味着它可以内联该函数调用。这使得它就像我手动调用 vector 的每个值上的函数一样高效。

如果我传递了一个函数指针,编译器无法立即看到它指向哪个函数,所以除非它执行一些相当复杂的全局优化,否则它必须在运行时取消引用该指针,然后使打电话。

关于c++ - 什么是 C++ 仿函数及其用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com