gpt4 book ai didi

c++ - 在代码体内定义仿函数

转载 作者:行者123 更新时间:2023-11-30 04:30:14 24 4
gpt4 key购买 nike

仿函数可以在函数体内局部定义吗?

我能想到的局部定义仿函数的一种可能用途是(特别是如果我们想使用 STL 算法)

我们有两个 vector std::vector<int>ab那么我们可以在很多方面平等地考虑它们。即 a[i] = b[i] (mod loop_counter)其中 loop_counter 不断变化,我们在每次循环迭代中测试它​​们是否相等。

for(int i=0 ; i<=10 ; ++i)
{
//Define binary predicate functor my_local_predicate

//Test for equality using functor local to loop
std::equal(a.begin(), a.end(), b.begin, my_local_predicate)

// Do something if they are equal OR unequal

}

如果答案是否定的,那么在每次迭代中相等条件不断变化的情况下,如何进行上述操作?

注意:我尝试按如下方式定义仿函数(此处没有 for 循环)但程序无法编译。

#include <algorithm>
#include <iostream>
#include <list>



int main() {

class EvenOddFunctor
{
int even_;
int odd_;
public:
EvenOddFunctor() : even_(0), odd_(0) {}
void operator()(int x) {
if (x%2 == 0) even_ += x;
else odd_ += x;
}
int even_sum() const { return even_; }
int odd_sum() const { return odd_; }
};

EvenOddFunctor evenodd;

int my_list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
evenodd = std::for_each(my_list,
my_list+sizeof(my_list)/sizeof(my_list[0]),
evenodd);

std::cout << "Sum of evens: " << evenodd.even_sum() << "\n";
std::cout << "Sum of odds: " << evenodd.odd_sum() << std::endl;

// output:
// Sum of evens: 30
// Sum of odds: 25
}

main() 之前移动仿函数定义代码编译干净,并正确执行。

因此,即使在函数体内定义仿函数似乎是不可能的,我还是想要一些不错的 STL,例如在每次迭代时更改相等条件的方法。

最佳答案

如果你可以使用 C++11,这就可以了。在 C++03 中,您不能使用本地类作为模板参数。您可以将 std::accumulate 与本地类静态函数(以及用于存储结果的非本地结构)一起使用:

struct EvenOdd
{
int even;
int odd;
static EvenOdd empty() { EvenOdd result= { }; return result; }
};

int main()
{
struct EvenOddFunctor
{
static EvenOdd function(const EvenOdd &old_result, int x)
{
EvenOdd result= old_result;
if (x%2 == 0) result.even += x;
else result.odd += x;
return result;
}
};

EvenOdd evenOdd= std::accumulate(..., EvenOdd::empty(), EvenOddFunctor::function);
}

关于c++ - 在代码体内定义仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844307/

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