如何在 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 并执行此操作,我可以实现此行为
我的实现使用直接指针算法,因为我可以访问
在移动构造中,但我不想放弃向量...
只是想添加这个来说明背后可能有什么样的理由
这些问题,我认为有时它是有效的
如何在不复制或遍历所有元素的情况下将 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 并执行此操作,我可以实现此行为 我的实现使用直接指针算法,因为我可以访问 在移动构造中,但我不想放弃向量...
只是想添加这个来说明背后可能有什么样的理由 这些问题,我认为有时它是有效的