http://www.cplusplus.com/reference/algorithm/for_each/
一元函数将范围内的元素作为参数.这可以是指向函数的指针,也可以是类重载operator()的对象.其返回值(如果有)将被忽略.
根据这篇文章,我预计for_each实际上会修改作为第三个参数给出的对象,但似乎for_each对临时对象进行操作,甚至不会修改赋予它的对象.
那么,为什么以这种方式实施呢?它似乎没那么有用.或者我误解了什么,下面的代码包含错误?
#include <iostream>
#include <vector>
#include <algorithm>
template <class T> struct Multiplicator{
T mresult;
public:
const T& result() const{return mresult;}
Multiplicator(T init_result = 1){
mresult = init_result;
}
void operator()(T element){
mresult *= element;
std::cout << element << " "; // debug print
}
};
int main()
{
std::vector<double> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
Multiplicator<double> multiply;
std::for_each(vec.begin(),vec.end(),multiply);
std::cout << "\nResult: " << multiply.result() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
1 2 3 Result: 6
Run Code Online (Sandbox Code Playgroud)
但得到以下输出:
1 2 3 Result: 1
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 16
函数对象由值获取. for_each
返回函数对象,因此如果将其更改为:
multiply = std::for_each(vec.begin(),vec.end(),multiply);
Run Code Online (Sandbox Code Playgroud)
你得到了预期的输出.
GMa*_*ckG 10
虽然James是正确的,但使用std::accumulate
with std::multiplies
会更正确,可能是:
#include <iostream>
#include <functional>
#include <numeric>
#include <vector>
int main(void)
{
std::vector<double> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
double result = std::accumulate(vec.begin(), vec.end(),
1.0, std::multiplies<double>());
std::cout << "\nResult: " << result << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
使用您的for_each
版本,您不需要再次复制仿函数,而是:
double result = std::for_each(vec.begin(), vec.end(), multiply).result();
Run Code Online (Sandbox Code Playgroud)
或者C++ 0x,为了好玩:
double result = 1;
std::for_each(vec.begin(), vec.end(), [&](double pX){ result *= pX; });
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2566 次 |
最近记录: |