系列C++问题请教高手之四:STL for_each algorithm & copy construtor

karlzheng 2007-04-11 10:19:23
昨天照Bjarne老兄的书写了一段代码如下,脑海中有一些问题:
1。sum1 = for_each(vi.begin(), vi.end(), sum1);这一个语句中sum1=调用了n_Sum& operator =(const n_Sum& sumclass),如果没有定义operator =,该程序也可以运行,那么是不是系统自动为类对像调用了一个赋值构造函数?--会自动给成员变量赋值?
2。code guru Scott Meyer告诉我们:prefer 传引用by 传值,那么在for_each(vi.begin(), vi.end(), sum1)这个语句中有没有办法,把sum1的引用传进去,而不是传sum1的对像--这样写:for_each(vi.begin(), vi.end(), &sum1);是运行不了的,有没有别的办法传引用?



template<class T> class n_Sum
{
T sum;
public:
n_Sum(T i=0):sum(i)
{
}
void operator()(T x)
{
sum += x;
}

n_Sum& operator =(const n_Sum& sumclass)
{
sum = sumclass.sum - 10;
return *this;
}

n_Sum(const n_Sum& S)
{
sum = S.sum -10;
}


T result() const
{
return sum;
}
};


int main()
{

int i;
vector<int> vi;
n_Sum<int> sum1;
for(i=1; i<=100; i++)
{
vi.push_back(i);
}

sum1 = for_each(vi.begin(), vi.end(), sum1);
cout<<"result:"<<sum1.result()<<endl;
return 0;
}
...全文
710 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sirguan 2007-04-12
  • 打赏
  • 举报
回复
函数对象推荐传值不传引用的。
参加effective stl 第 38条
http://www.stlchina.org/documents/EffectiveSTL/index.html
taodm 2007-04-12
  • 打赏
  • 举报
回复
因为在公司竟然无法进csdn blog ,狂汗。
FingerStyle 2007-04-12
  • 打赏
  • 举报
回复
taodm 的blog怎么写道2004年 就不写了 ??
期待 STL和 boost(虽然还没学) 的好文。。。。
taodm 2007-04-12
  • 打赏
  • 举报
回复
google "Effective Standard C++ Library: Explicit Function Template Argument Specification and STL A New Language Feature and Its Impact on Old Programming Techniques"
karlzheng 2007-04-12
  • 打赏
  • 举报
回复
for_each(vi.begin(), vi.end(), &sum1);
=======================================
&sum1这里是取地址不是引用。
传引用要这样
=========================================
取地址和传引用怎么样区别?。。。?
karlzheng 2007-04-12
  • 打赏
  • 举报
回复
问题1, 认真看effective c++
问题2, 可以的。
for_each<vector<int>::iterator, n_Sum<int> &>vi.begin(), vi.end(), sum1);
不过,不要这么做!这违背了for_each的设计语意。
=========================================================================
谢谢,问题1看了effective c++,明白了
问题2:试了一下,OK。佩服你:-)
请问这是模板特化吗? 为什么说违背了for_each的设计语意,能讲明白点吗?
for_each不是要对每一个传进去的对象进行()operate吗?---如本贴所示--我不是想让它对我传进去的对象的拷贝进行操作啊?。。。。

karlzheng 2007-04-12
  • 打赏
  • 举报
回复
&sum1这里是取地址不是引用。
传引用要这样
n_Sum<int>& sum=sum1;
for_each(vi.begin(), vi.end(), sum);
=======================================
试了一下,这样不是想要的结果:即执行了
for_each(vi.begin(), vi.end(), sum);
cout<<"result:"<<sum1.result()<<endl;
之后,打印出来的结果是0而不是5050.....
FingerStyle 2007-04-12
  • 打赏
  • 举报
回复
taodm((不能收CSDN社区短信息,请莫浪费精力)) ( ) 信誉:100 Blog 加为好友 2007-04-12 12:06:14 得分: 0


因为在公司竟然无法进csdn blog ,狂汗。
=============================================
的确应该汗一把。。
Jofee 2007-04-11
  • 打赏
  • 举报
回复
for_each(vi.begin(), vi.end(), &sum1);
=======================================
&sum1这里是取地址不是引用。
传引用要这样
n_Sum<int>& sum=sum1;
for_each(vi.begin(), vi.end(), sum);
taodm 2007-04-11
  • 打赏
  • 举报
回复
问题1, 认真看effective c++
问题2, 可以的。
for_each<vector<int>::iterator, n_Sum<int> &>vi.begin(), vi.end(), sum1);
不过,不要这么做!这违背了for_each的设计语意。

可以使用boost::ref库。
  • 打赏
  • 举报
回复
1 for_each 调用的是
void operator()(T x)
{
sum += x;
}
2 for_each最后一个参数是函数对象 是 by val传递的,见for_each声明
template<class InputIterator, class Function>
Function for_each(
InputIterator _First,
InputIterator _Last,
Function _Func
);
源码直接下载地址: https://pan.quark.cn/s/d280357b18e5 在网页构建领域中,HTML5被视为当代网页工程的基础规范,其问世显著增强了页面的视觉表现力与用户互动性。本工程致力于运用HTML5技术开发一个电视剧信息展示页面,目的是呈现诸如剧名、演员构成、故事梗概等电视剧关键资料。接下来将深入阐释如何借助HTML5的结构化组件和样式管理功能达成此项目目标。 我们必须掌握HTML5的核心框架。一个规范的HTML5文档一般包含``声明、``根标记、``头部标记和``主体标记。在头部区域,可以配置网页的基本元数据,例如字符集设定、页面标题等。在主体部分,将具体构建电视剧信息列表的内容。 电视剧展示页面通常包含多个条目,每个条目对应一部电视剧。HTML5中的`
`标记用于内容模块化,适合表示单个电视剧的详细信息区域。每个`
`内部,可使用`

`标题标记显示剧名,``图像标记插入宣传剧照,`

`段落标记呈现剧情介绍,而`

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧