首页 新闻 会员 周边 捐助

多谢多谢多谢

0
悬赏园豆:5 [已解决问题] 解决于 2014-08-28 10:24

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class add{
public:
add():value(0){}
void operator()(int i){value += i;}
void print(){cout << "the value is "<< value << endl;}
private:
int value;
};

int main(){
vector<int> v1;
for(int i = 1;i < 100;i ++){
v1.push_back(i);
}
add add1;
for_each(v1.begin(),v1.end(),add1);
add1.print();
}

最后结果应该为4950,可是最后输出的是0,为什么呢??

c++
demps_c的主页 demps_c | 初学一级 | 园豆:128
提问于:2014-08-23 23:50
< >
分享
最佳答案
0

看看for_each()函数的定义

template<class InputIterator, class Function>
  Function for_each(InputIterator first, InputIterator last, Function fn)
{
  while (first!=last) {
    fn (*first);
    ++first;
  }
  return fn;      // or, since C++11: return move(fn);
}

传进去的Function是按值传递,改变不会带出来,要变的话只有把value改为static,或者用int * value;

收获园豆:3
panyihua | 菜鸟二级 |园豆:209 | 2014-08-27 22:39

这就说得过去了,谢谢

demps_c | 园豆:128 (初学一级) | 2014-08-28 10:23

@demps_c: 最好的是

add add1;
add1 = for_each(v1.begin(),v1.end(),add1);

add1.print();

这个标准做法

demps_c | 园豆:128 (初学一级) | 2014-08-28 13:38
其他回答(1)
0

1、按照你的思路也应该是5050,怎么变成4950了?

2、对C好久木有弄了,所以有点看不懂,不过,你的foreach有执行(add1(xx))吗?貌似没有吧?

收获园豆:2
519740105 | 园豆:5810 (大侠五级) | 2014-08-24 14:45

1 加到99 是4950

这个是函数对象,执行了的。

要不把void operator()(int i){value += i;}改为

void operator()(int i){value += i;cout<< value << endl;}就会出现最后的值是4950

可是最终的结果不知道怎么回事

支持(0) 反对(0) demps_c | 园豆:128 (初学一级) | 2014-08-24 14:52

@demps_c: 应该是operator调用的value与print调用的value不是属于一个对象的。

1、你尝试对foreach调用两次,看最后的结果是否9900?

2、你尝试对add初始化value为非0,看下结果是否又是4950?

对C真心的忘记了,按照我上面的思路,你分析下代码看。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-24 15:05

@519740105: 尝试 ???先出结果然后对应结果找原因??不好吧

支持(0) 反对(0) demps_c | 园豆:128 (初学一级) | 2014-08-24 15:21

@demps_c: 明显你的operator的value跟print的value不是同一个,又或者value没有真正的存储起来,所以才会有这样的问题。

我对C的操作符没研究过,所以没办法给你具体的帮助,只能这样提示你而已。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-24 17:12

@519740105: 谢谢了。我好好看看

支持(0) 反对(0) demps_c | 园豆:128 (初学一级) | 2014-08-24 19:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册