【问题标题】:vector elements unexpected behaviour after applied `std::transform()` function [duplicate]应用`std::transform()`函数后向量元素的意外行为[重复]
【发布时间】: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> arr1{1, 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> vec1{1, 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; arr2{}arr2.size() 是 2,std::vector&lt;int&gt; vec2{};vec2.size() 是 0。

标签: c++ vector


【解决方案1】:

问题在于vec2。您尝试修改此空向量中的元素,这将导致未定义的行为

简单的解决方案是确保向量的大小正确:

std::vector<int> vec2(vec1.size());

您还可以使用std::back_inserter 动态附加到向量:

std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2), increment);

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2015-11-24
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多