[英]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
上調用解除分配? 或者可能對 go 有任何其他想法?
你不能。
一個向量擁有它的緩沖區。 你不能偷它。
您必須單獨復制/移動元素,可選擇使用為您執行迭代的輔助算法( std::copy
/ std::move
)。
(另請注意,由於您的元素類型只是float
,因此此處的移動是副本。)
(另請注意,此算法std::move
std::move
與右值轉換 std::move 不同。)
考慮你是否真的需要這樣做。 只要您保持向量處於活動狀態,您就可以在需要時使用vec.data()
將向量的數據視為一個數組。 這肯定比犧牲 RAII 更好?
這對我來說很方便將“類型化”向量內容竊取到“非類型化”向量中。
這就是我想要做的:
std::vector<uint8_t>one;
std::vector<V> other = std::move(one);
當我知道內容正是我所期望的(有一個運行時類型信息字段)
我將使用它在無類型和有類型 class 之間進行“移動語義”,其中基礎表示的一部分位於向量中 - 僅在類型化的情況下,它是 Vs 的向量。
將其視為數據的不同“視圖”。 在一般情況下,數據是無類型的,因為存在特殊的邊緣情況,但是在通過分支處理它們之后,處理“正常”情況類型安全的方式會很方便..
我看到如果我拋棄 std::vector 並使用直接指針算術執行我的實現,我可以實現這種行為,因為我可以在移動構造中訪問它,但我不想放棄向量......
只是想添加這個以顯示這些問題背后可能存在什么樣的理由,我認為有時它是有效的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.