带有transform的for_each出现意外行为
Unexpected behaviour of for_each with transform
当我用std::transform取消注释注释行时,上面的for_each将不会打印任何内容。下面的for_each也不打印任何内容。我认为代码会从v中提取元素,增加它们并将它们插入v2中。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(const int& what){
cout<<what<<" ";
}
int change(const int& from){
return from+1;
}
int main() {
vector<int> v(5,10);
vector<int> v2;
for_each(v.begin(),v.end(),print);
//transform(v.begin(),v.end(),v2.begin(),change);
for_each(v2.begin(),v2.end(),print);
return 0;
}
您的第二个集合是空的——要向其中插入项,您需要使用std;:back_inserter:
transform(v.begin(), v.end(), back_inserter(v2), change);
然而,请注意,for_each
在这里也不是真正的最佳选择。如果你要使用标准算法,我建议复制到ostream_iterator
:
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
transform(v.begin(), v.end(), back_inserter(v2));
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
如果你真正想做的只是在输入中的每一项中添加一个,你可能会发现使用std::plus
之类的东西比自己编写代码更容易(或者,如果你有C++11,你可以使用lambda)。
为了回答您实际提出的问题(为什么当您按原样执行transform
时,这些问题都不起作用):您有未定义的行为试图访问当前边界之外的向量。因此,任何行为都是允许的。在UB被实际调用之前,通常很难看到程序中的UB稍后会如何影响代码的行为,但标准非常明确地允许这样做。一些编译器利用这一点来实现优化(例如),否则这些优化是不可能的。
std::transform
的目标范围必须足够大,以容纳结果。您的v2
是一个空向量。您可以在调用std::transform
之前调用v2.resize()
,也可以像这样使用back_inserter
:
transform(v.begin(),v.end(),back_inserter(v2),change);
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++中意外的多头值
- vector.size() 在比较中意外工作
- 使用 malloc() 时出现意外大小
- 多线程程序中出现意外的内存泄漏
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 字符串比较中的意外输出
- 我的代码中的意外价值以及我如何修复它
- C++ 编译错误:意外的类型名称"字符串":预期的表达式