首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ for_each()和函数指针

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

Stack Overflow用户
提问于 2010-10-29 01:44:34
回答 8查看 1.2K关注 0票数 0

我试图让myFunction给我数组中的值的和,但我知道我不能使用返回值,当我用代码运行我的程序时,我得到的只是打印出的值而没有和,这是为什么?

代码语言:javascript
复制
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;
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-10-29 01:48:59

你确实需要一个函数器来存储迭代之间的状态:

代码语言:javascript
复制
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;
}
票数 8
EN

Stack Overflow用户

发布于 2010-10-29 01:50:57

当您声明一个变量(即int total)时,它在其作用域的持续时间内一直存在(通常相当于周围最接近的一对{}。因此,在您的函数myFunction中,当函数返回时,total将不复存在。它每次调用返回一次--也就是数组中的每个元素返回一次。为了实际求和变量的值(或者将变量保留在myFunction末尾之外),必须给它一个更大的作用域。

有两种相关的方法可以做到这一点。一种是“好”的方式,另一种是“简单但风格不好”的方式。好的方法是使用函数器或上下文对象--@Martin已经发布了一个示例。“坏”的方法是将int total标记为static。如果你的代码是单线程的,它会在你第一次使用它的时候工作。然后就再也不会了。如果有人建议..。,不要这样做。:)

票数 1
EN

Stack Overflow用户

发布于 2010-10-29 02:00:01

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

  • total提供静态存储持续时间(使用static关键字),但是您不能将其值赋给任何东西,因为它仍然是局部作用域。如果你想重用这个函数,无论如何都不是一个好主意。
  • 使total成为一个全局变量。如果你想重用这个function
  • make作为一个“函数器”,这也是一个坏主意,就像Martin York的回答中所描述的那样。这是可重用程度最高的implementation

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

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4045669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档