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

How to move a std::vector into a raw array in C++

如何在不复制或遍历所有元素的情况下将 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;
}

如何为我的数组分配 std::vector 中的数据并确保不会在 std::vector 上调用释放?或者还有其他想法可以解决这个问题?

你不能。

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

您必须单独 copy/move 元素,可选择使用辅助算法为您进行迭代 (std::copy/std::move)。

(另请注意,由于您的元素类型只是 float,此处的移动 的副本。)

(另请注意,此 std::move 算法与 std::move 右值转换不同。)


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

这对我来说很方便,可以将“类型化”向量内容窃取到“非类型化”向量中。

这就是我想要做的:

std::vector<uint8_t>­one;
std::vector<V> other = std::move(one);

当我知道内容正是我所期望的(有一个运行时类型信息字段)

我会用它来 'move semantics' 和类型 class 其中基础表示的一部分 在一个向量中——只是在类型化的情况下它是 Vs 的向量。

将其视为数据的不同“视图”。一般情况下的数据 是无类型的,因为有特殊的边缘情况,但是在通过处理它们之后 分支处理“正常”情况类型安全的方式会很方便..

我知道如果我抛出 std::vector 并执行此操作,我可以实现此行为 我的实现使用直接指针算法,因为我可以访问 在移动构造中,但我不想放弃向量...

只是想添加这个来说明背后可能有什么样的理由 这些问题,我认为有时它是有效的