Why can#39;t for_each modify its functor argument?(为什么 for_each 不能修改它的函子参数?)
问题描述
http://www.cplusplus.com/reference/algorithm/for_each/一>
取一个元素的一元函数范围作为参数.这既可以是一个指向函数或类重载的对象操作员().它的返回值,如果有的话,被忽略.
http://www.cplusplus.com/reference/algorithm/for_each/
Unary function taking an element in the range as argument. This can either be a pointer to a function or an object whose class overloads operator(). Its return value, if any, is ignored.
根据这篇文章,我预计 for_each 实际上修改了作为其第三个参数给出的对象,但似乎 for_each 操作的是一个临时对象,甚至没有修改给它的对象.
According to this article, I expected that for_each actually modifies the object given as its third argument, but it seems like for_each operates on a temporary object, and doesn't even modify the object given to it.
那么,为什么要这样实现呢?它似乎不太有用.还是我误解了什么,我下面的代码包含错误?
So, why is it implemented in that way? It seems much less useful. Or did I misunderstand something and my code below contains errors?
#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 << "
Result: " << multiply.result() << std::endl;
return 0;
}
预期输出:
1 2 3 Result: 6
但得到以下输出:
1 2 3 Result: 1
推荐答案
函数对象按值取.for_each
返回函数对象,因此如果将其更改为:
The function object is taken by value. for_each
returns the function object, so if you change it to:
multiply = std::for_each(vec.begin(),vec.end(),multiply);
你得到了预期的输出.
这篇关于为什么 for_each 不能修改它的函子参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么 for_each 不能修改它的函子参数?
基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 从 std::cin 读取密码 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01