簡體   English   中英

如何將 std::vector 移動到 C++ 中的原始數組中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM