c ++ for_each()和对象函数

时间:2010-10-28 16:52:42

标签: c++

我的作业如下:

对于给定的整数数组,找到其元素的总和并打印出最终的数组 得到结果,你需要在STL中执行函数for_each() 只有一次(没有循环)。

截至目前,这是我的代码:

void myFunction (int i) {
cout << " " << i << " " <<  endl;
} 


int main() {

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

vector<int> v(array[0], array[10]);

for_each( v.begin(), v.end(), myFunction);

return 0;
}

但由于某种原因,输出显示为4198853,起初我认为它是一个内存地址,但我发现这是错误的。有什么想法我可能做错了吗?

10 个答案:

答案 0 :(得分:10)

vector<int> v(array[0], array[10]);

这不符合你的要求。 array[0]是第一个值(1)。 array[10]在数组末尾无效访问。要传递指向vector构造函数的指针,您需要:

vector<int> v(array, array+10);

答案 1 :(得分:4)

嗯,除了人们迄今为止所说的内容之外,还有一些问题。一个是你的错,另一个是我认为的任务问题。

你打印出的元素,而不是总和。作业请求总和......你做错了。您需要一些调用X来汇总所有值并将其粘贴到变量中以便以后打印。

另一个问题是std :: for_each不适合此任务。事实上,它不是合适的算法,它甚至不能保证在没有很多时髦的黑客的情况下工作,使你传递给for_each的仿函数的所有副本共享同一个计数器。也许这就是你老师想要你弄清楚怎么做的事情,但我有一种感觉(经历了编程教师的共同能力),他/她实际上并不知道他们教你错了。问题的主要要点是std :: for_each的实现可以自由地将函数对象的任意数量的副本传递给递归或实用程序调用,以产生for_each的标准行为。

使用的适当算法是std :: accumulate。在任何生产代码中,我拒绝编写或接受其他团队成员,使用std :: for_each来生成总和。但是,我可能会回答这种情况,并提出一个非常糟糕的黑客和评论,提到for_each是错误的算法。像这样:

struct fugly_functor
{
  int * summation_variable; // using a local copy will result in correct answer, or a completely wrong answer depending on implementation of for_each

  fugly_functor(int * c) : counter(c) {}
  void operator(int x) { *summation_variable += x; }
};
...
int my_sum;
std::for_each(array, array+ELEM_COUNT, fugly_functor(&my_sum));
std::cout << my_sum << std::endl;

然后我建议我的老师熟悉一套完整的标准C ++算法。

正确的方法看起来像这样:

int my_sum = std::accumulate(array, array+ELEM_COUNT, 0);

答案 2 :(得分:2)

在这一行:

vector<int> v(array[0], array[10]);

您已编入超出数组范围的索引。这会导致未定义的行为。

此外,您使用的矢量构造函数不符合您的想法。你曾经使用过:

vector(initial value, count);

答案 3 :(得分:2)

为什么不呢:

for_each( array, array+10, myFunction);

我很确定int*可以用作迭代器

编辑:刚检查过这个,确实可以

答案 4 :(得分:1)

该数组包含10个元素,因此10不是有效的数组索引。

vector<int> v(array[0], array[10]);
                              ^^

你想要的是:

vector<int> v(array, array + sizeof(array) / sizeof(int) );

答案 5 :(得分:1)

数组的索引为0..9,所以array [9] = 10

如果array [10]没有抛出错误,它将包含错误数据,导致此问题。

答案 6 :(得分:0)

您需要获取array [0]和array [sizeof(array)/ sizeof(* array)]的地址。向量构造函数采用迭代器类型(即在此上下文中指针),它不能从array [0]的值神奇地确定array [1]的值。

答案 7 :(得分:0)

你没有正确构造向量。采用两个整数的构造函数是

vector(size_type _Count,const Type&amp; _Val);

所以_Count是1而_Value是一个超出数组末尾的未定义值。

答案 8 :(得分:0)

如果你真的想要计算总和,std::accucumulate就是你想要的,而不是for_each

答案 9 :(得分:0)

我知道你被告知要使用for_each,但我实际上会这样做 - 也许是额外信用的另一种选择; - )

#include <numeric>
using namespace std;

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

int sum = accumulate(array, array + (sizeof(array) / sizeof(int)), 0);

accumulate专门用于对可迭代范围的元素求和。