如何在C ++中将std :: vector移动到原始数组

Bob*_*ugo 4 c++ stdvector move-semantics

如何std::vector安全地将其内容移动到数组中,而无需复制或遍历所有元素?

void someFunc(float* arr, std::size_t& size)
{
   std::vector<float> vec(5, 1.5f);
   // do something with the data

   size = vec.size();
   arr = vec.data(); // this doesn't work, as at the end of the function the data in std::vector will be deallocated

}

main()
{
   float* arr;
   std::size_t size{0};

   someFunc(arr, size);

   // do something with the data
   delete [] arr;
}

Run Code Online (Sandbox Code Playgroud)

如何为数组分配数据,std::vector并确保不会调用取消分配std::vector?也许还有其他想法可以解决这个问题?

Lig*_*ica 7

你不能

向量拥有其缓冲区。你不能偷它。

您将必须单独复制/移动元素,可以选择使用帮助您进行迭代的辅助算法(std::copy/ std::move)。

(还请注意,由于您的元素类型为just float,因此此处的移动副本。)

(还要注意,此std::move算法std::move与右值强制转换不同。)


考虑您是否真的需要这样做。vec.data()只要使向量保持活动状态,就可以在需要时使用向量数据作为数组。当然,这比牺牲RAII更好吗?

  • https://en.cppreference.com/w/cpp/algorithm/move虽然,由于您只有浮点数,所以“ move”实际上只是一个副本。 (3认同)