如何在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
调用释放? 或者也许还有其他想法可以解决这个问题?
你不能。
向量拥有其缓冲区。你不能偷它。
您必须单独复制/移动元素,可以选择使用为您进行迭代的辅助算法(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 并做 我的实现使用直接指针算法,这样我就可以访问 在移动构造中,但我很想不要放弃向量......
只是想添加这个以显示背后可能有什么样的理由 这类问题,我认为有时它是有效的
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 如何在C++中将 std::vector 移动到原始数组中
- 在保持原始对象的同时移动
- 将原始指针移动到已创建函数中的下一个字符
- 在原始对象上使用惯用(例如 TBB 的 thread_enumerable_specific')移动赋值调用析构函数
- 在Qt中获取原始鼠标移动
- 移动是否分配了 std::fstream 关闭原始流
- 对容器进行排序,然后在保留原始排序的情况下移动元素
- 如何将unique_ptr移动到原始指针
- 将原始指针内容移动到vector
- 将列表框中的项移动到其原始位置
- 自动生成移动操作和原始指针成员