首頁  >  文章  >  後端開發  >  移自 `std::vector` 是否保證為空?

移自 `std::vector` 是否保證為空?

Susan Sarandon
Susan Sarandon原創
2024-11-18 03:04:02266瀏覽

 Is a Moved-From `std::vector` Guaranteed to Be Empty?

移出向量是否保證為空?

一般來說,C 標準對之後的物件狀態提供了最低限度的指導他們已被搬離。如 N3485 17.6.5.15 [lib.types.movedfrom]/1 所述:

C 標準庫中定義的類型的物件可以從 (12.8) 移出。移動操作可以明確指定或隱式產生。除非另有規定,此類移出的對象應置於有效但未指定的狀態。

雖然此規定並不排除向量受到此行為的影響,但它留下了解釋的空間。

Vector 的特定行為

沒有明確的標準要求來排除向量受到移出物件的一般規則的影響。然而,考慮到向量實現的要求,選項有限:

移動構造函數:

  • 移動構造函數必須具有恆定的複雜性。
  • 唯一的選擇是從來源向量 (v) 竊取資源來建構新向量,使 v 為空。

移動賦值運算子:

  • 行為取決於向量的分配器:

情況一:

  • allocator_traits::propagate_on_container_mue_containmenter = true
  • 目標向量(*this)中的所有元素都被破壞。
  • 使用 *this 中的分配器釋放容量。
  • 分配器和記憶體緩衝區所有權從 *this 轉移v 到 *this。
  • *在移動分配之前,這通常是空的。

情況二:

  • allocator_traits
  • allocator_traits
  • allocator_traits

A>::propagate_on_container_move_assignment::value == false 且 get_allocator() == v.get_allocator()

與情況一類似的行為,但分配器不會移動。
  • Case 之間的決定第二種和情況三是在運行時進行的,這會影響對 T 的要求。
  • 情況三:
allocator_traits::propagate_on_container_move_assignment ::value == false 且 _all_ocator v.get_allocator()

分配器無法移動,資源無法從 v 轉移到 *this。

唯一的實作方式移動分配是使用分配操作將每個 T 從 v 單獨移動到 *this。 這要求 T 是 MoveAssignable 或 MoveInsertable(取決於 *this 中容量和大小的可用性)。 結論:

對於向量的移動建構函數,移出向量永遠為空。對於移動賦值運算符,移出向量通常為空,但在分配器不相容且 T 為 MoveAssignable 或 MoveInsertable 的某些特定場景中可能不是空的。

以上是移自 `std::vector` 是否保證為空?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn