系列C++有关问题之四:STL for_each algorithm & copy construtor
系列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(虽然还没学) 的好文。。。。
------解决方案--------------------
因为在公司竟然无法进**** blog ,狂汗。
------解决方案--------------------
函数对象推荐传值不传引用的。
参加effective stl 第 38条
http://www.stlchina.org/documents/EffectiveSTL/index.html
昨天照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(虽然还没学) 的好文。。。。
------解决方案--------------------
因为在公司竟然无法进**** blog ,狂汗。
------解决方案--------------------
函数对象推荐传值不传引用的。
参加effective stl 第 38条
http://www.stlchina.org/documents/EffectiveSTL/index.html