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

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

本文关键字:移动 原始 数组 vector C++ 中将 std      更新时间:2023-10-16

如何在不复制或迭代所有元素的情况下安全地将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调用释放? 或者也许还有其他想法可以解决这个问题?

你不能。

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

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

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

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


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

这对我来说很方便,可以将"类型化"矢量内容窃取为"非类型化"矢量。

这就是我想做的:

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

当我知道内容完全符合我的期望时(有一个运行时类型信息字段(

我会用它来在非类型化之间做"移动语义" 以及一个类型化类,其中基础表示的一部分 在向量中 - 只是在类型化的情况下,它是 V 的向量。

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

我看到如果我扔掉 std::vector 并做 我的实现使用直接指针算法,这样我就可以访问 在移动构造中,但我很想不要放弃向量......

只是想添加这个以显示背后可能有什么样的理由 这类问题,我认为有时它是有效的