应用`std::transform()`函数后向量元素的意外行为[重复]

Posted

技术标签:

【中文标题】应用`std::transform()`函数后向量元素的意外行为[重复]【英文标题】:vector elements unexpected behaviour after applied `std::transform()` function [duplicate] 【发布时间】:2020-12-07 11:00:38 【问题描述】:

分别将std::transform() 应用到arrayvector 之后。 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&lt;int, 2&gt; arr2arr2.size() 是 2,std::vector&lt;int&gt; 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()`函数后向量元素的意外行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章

std :: transform一元操作签名

std::transform 到任意容器

插入向量变换

Demo00

理解std::transform

是 std::transform SIMD 功能吗?