读书人

系列C++有关问题之四:STL for_each a

发布时间: 2012-02-24 16:30:38 作者: rapoo

系列C++问题请教高手之四:STL for_each algorithm & copy construtor
昨天照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;
}

[解决办法]
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
);

[解决办法]
问题1, 认真看effective c++
问题2, 可以的。
for_each <vector <int> ::iterator, n_Sum <int> &> vi.begin(), vi.end(), sum1);
不过,不要这么做!这违背了for_each的设计语意。

可以使用boost::ref库。
[解决办法]
for_each(vi.begin(), vi.end(), &sum1);
=======================================
&sum1这里是取地址不是引用。
传引用要这样
n_Sum <int> & sum=sum1;
for_each(vi.begin(), vi.end(), sum);
[解决办法]
google "Effective Standard C++ Library: Explicit Function Template Argument Specification and STL A New Language Feature and Its Impact on Old Programming Techniques "
[解决办法]
taodm 的blog怎么写道2004年 就不写了 ??
期待 STL和 boost(虽然还没学) 的好文。。。。
[解决办法]
因为在公司竟然无法进csdn blog ,狂汗。
[解决办法]
函数对象推荐传值不传引用的。
参加effective stl 第 38条
http://www.stlchina.org/documents/EffectiveSTL/index.html

读书人网 >C++

热点推荐