簡體   English   中英

是std :: vector需要使用move而不是copy嗎?

[英]are std::vector required to use move instead of copy?

std::vector是否需要使用move而不是copy,在標准的grow / swap / erase重新分配時? 或者這是純粹的實施優化?

如果std::vector 需要使用move,在什么條件下? 哪些規則/條件可以閱讀?

我發現這個如何在向量增長時強制執行移動語義? 但是沒有關於擔保的答案。

UPDATE

什么時候需要在重新分配時使用移動構造函數? 它說它需要重新分配移動語義?

std::vector是否需要使用move而不是copy,按標准?

我認為你指的是元素的移動和復制。

如果您不使用執行這些操作的成員函數,則根本不需要使用復制或移動。 復制元素需要一些成員函數,移動元素需要其他成員函數。

當需要在重新分配時使用移動構造函數

如果元素不是可復制插入的,則需要使用move(這不需要規則,你不能做你不能做的事情)。 否則,如果移動構造函數可以拋出則需要復制(這是下面引用的強異常保證所要求的)。 如果可以證明非投擲移動,那么它似乎取決於實施,因為我沒有找到任何進一步的保證。 一個好的實現將在noexcept時移動。

相關功能的例外保證:

如果除非由非CopyInsertable T的移動構造函數拋出異常,則不會產生任何影響。

user2079303的答案很好,但我總結一下,僅供我自己使用。

標准C ++ 17 根本不需要std::vector在重新分配期間移動。 如果對象是可復制的,它允許始終使用副本。

例如, std::vector<std::vector<std::array<char, 10000>>>每次都需要復制,當需要在grow上重新分配其元素時。

不要相信庫實現者,總是檢查你的可復制+可移動類型如何在你的環境中使用std::vector 它可以是任何東西,因為它允許任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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