C ++的for_each()和函数指针

我尽量让myFunction的给我数组中的值的总和,但我知道我不能用一个返回值,当我运行我的程序与代码,所以我得到的是一个打印出来的值并且,任何款项,为什么会这样?

void myFunction (int i) { int total = 0; total += i; cout << total; } int main() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for_each( array, array+10, myFunction); return 0; }

--------------解决方案-------------

你真的需要一个函子来存储迭代之间的状态:

struct Sum
{
Sum(int& v): value(v) {}
void operator()(int data) const { value += data;}

int& value;
};

int main()
{
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int total = 0;
std::for_each( array, array+10, Sum(total));

std::cout << total << std::endl;
}

当您(即声明一个变量int total )它的首要目标和范围的持续时间(通常相当于最近周围对{}所以,在你的函数myFunctiontotal不复存在当函数返回时,它返回一次每次调用-每一次元素的数组,这是为了实际总结它的值(或以其它方式保留超出结束的变量myFunction ,你必须给它一个范围更广。

有两个相关的方法可以做到这一点。 一个是“好”的方式,一个是“比较容易但很严重,病急乱投医”的方式。 好办法涉及仿函数或上下文对象 - @马丁已经发布了一个例子。 “坏”的方式标记int totalstatic 。 它会工作的第一次使用它,如果你的代码是单线程的......然后永远不再。 如果有人建议它...... 不这样做 。 :)

total是具有自动存储持续时间的变量。 每次myFunction()被调用时,一个新的total被创建和初始化为0,你可以:

  • total静态存储时间(用static关键字),但你不能它的价值分配到任何东西,因为它仍然是本地范围。 一个糟糕的主意,如果你想重新使用此功能,总之。
  • 使total一个全局变量。 另外一个坏主意,如果你想重用此功能
  • 做一个“仿”,如Martin纽约的答案描述。 这是最可重复使用的实施

但是,我选择的解决方案是“你是问错了问题”,你应该使用std::accumulate()

#include <iostream>
#include <numeric>

int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int total = std::accumulate(array, array+10, 0);
std::cout << total << '\n';
return 0;
}

total为当地的每个函数调用。 它初始化为0在每次迭代。 你可以只声明它的全球(或包成一个参数,等等)

myFunction是被称为每个时间和total是局部的功能...尝试标记totalstatic ,而不是:

static int total = 0

你需要让整个函数调用的总持续。 您还需要从增加的中间结果呢,这就排除了(至少是直接的使用),功能都单独访问结果 - 你真的需要一个类来代替。

total是一个局部变量。 一旦它就会被破坏myFunction处理完一个数据。

典型的方法有一个状态是使myFunction函数对象(一个结构的重载()运算符)。
肮脏的方法是使total一个全局变量。
在你的情况我建议你使用accumulate功能,而不是(假设cout << total只是为了调试)。

你'总'的值每次调用该函数的时间重置为0。

声明其'static'

void myFunction (int i) {
static int total = 0;
total += i;
cout << total;
}

编辑:

另外,如果你想稍后访问“总”的价值,你要么需要使用全局变量(某种!可能是一类或函子!不要火焰我!),或者只是使用了环路,并通过它作为一个指针(即不使用的for_each):

void myFunction (int i, int * p_total) {
//No initialization
*p_total += i;
cout << *p_total;
}

int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int total = 0;

for(int i = 0; i < 10, i++)
myFunction(array[i], &total);

//total is now 55

return 0;
}

注:我是一个C程序员努力学习C ++。 这是我会怎么做(这是非常类似C),它可能不是标准C ++的方式。

分类:C# 时间:2015-03-16 人气:10
本文关键词: C#中,函数指针
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.930 (s). 10 q(s)