我试图让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;
}发布于 2010-10-29 01:48:59
你确实需要一个函数器来存储迭代之间的状态:
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;
}发布于 2010-10-29 01:50:57
当您声明一个变量(即int total)时,它在其作用域的持续时间内一直存在(通常相当于周围最接近的一对{和}。因此,在您的函数myFunction中,当函数返回时,total将不复存在。它每次调用返回一次--也就是数组中的每个元素返回一次。为了实际求和变量的值(或者将变量保留在myFunction末尾之外),必须给它一个更大的作用域。
有两种相关的方法可以做到这一点。一种是“好”的方式,另一种是“简单但风格不好”的方式。好的方法是使用函数器或上下文对象--@Martin已经发布了一个示例。“坏”的方法是将int total标记为static。如果你的代码是单线程的,它会在你第一次使用它的时候工作。然后就再也不会了。如果有人建议..。,不要这样做。:)
发布于 2010-10-29 02:00:01
total是一个具有自动存储持续时间的变量。每次调用myFunction()时,都会创建一个新的total并将其初始化为0。您可以:
total提供静态存储持续时间(使用static关键字),但是您不能将其值赋给任何东西,因为它仍然是局部作用域。如果你想重用这个函数,无论如何都不是一个好主意。total成为一个全局变量。如果你想重用这个function但是,我选择的解决方案是“你问错了问题”,你应该使用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;
}https://stackoverflow.com/questions/4045669
复制相似问题