应用`std::transform()`函数后向量元素的意外行为[重复]
Posted
技术标签:
【中文标题】应用`std::transform()`函数后向量元素的意外行为[重复]【英文标题】:vector elements unexpected behaviour after applied `std::transform()` function [duplicate] 【发布时间】:2020-12-07 11:00:38 【问题描述】:分别将std::transform()
应用到array
和vector
之后。 array
代码按预期工作,但是,vector
代码在使用 transform()
后没有 cout
其元素:
int increment(int x)
return (x + 1);
int main()
std::array<int, 2> arr11, 2;
std::array<int, 2> arr2;
for (const auto &item : arr1)
std::cout << "arr1: " << item << '\n';
std::transform(arr1.begin(), arr1.end(), arr2.begin(), increment);
for (const auto &item : arr1)
std::cout << "arr1: " << item << '\n';
for (const auto &item : arr2)
std::cout << "arr2: " << item << '\n';
std::vector<int> vec11, 2;
std::vector<int> vec2;
for (const auto &item : vec1)
std::cout << "vec1: " << item << '\n';
std::transform(vec1.begin(), vec1.end(), vec2.begin(), increment);
for (const auto &item : vec1)
std::cout << "vec1: " << item << '\n';
for (const auto &item : vec2)
std::cout << "vec2: " << item << '\n';
return 0;
>>
arr1: 1
arr1: 2
arr1: 1
arr1: 2
arr2: 2
arr2: 3
vec1: 1
vec1: 2
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
在transform()
应用后丢失了项目。它由 CLion 使用 c++20 运行。
【问题讨论】:
你可能想要std::back_inserter
。
std::array<int, 2> arr2
,arr2.size()
是 2,std::vector<int> vec2;
,vec2.size()
是 0。
【参考方案1】:
问题在于vec2
是空。您尝试修改此空向量中的元素,这将导致未定义的行为。
简单的解决方案是确保向量的大小正确:
std::vector<int> vec2(vec1.size());
您还可以使用std::back_inserter
动态附加到向量:
std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2), increment);
【讨论】:
以上是关于应用`std::transform()`函数后向量元素的意外行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章