首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ Primer 中「swap 僅交換容器內部數據結構」的含義解析

     編輯:程式設計疑難解答

原文背景

《C++ Primer》第 5 版第 303 頁提到:「swap 只是交換了兩個容器的內部數據結構」。許多讀者對此感到困惑:這究竟意味著什麼?是淺拷貝還是深拷貝?

核心含義

這句話描述的是 常數時間復雜度 O(1) 的交換機制。標準庫容器(如 vector、list、map 等)的 swap 成員函數不會逐個元素拷貝或移動,而是直接交換容器對象內部的幾個關鍵指標/元數據:

  • 指向動態分配內存的指標(首元素地址、末尾地址、容量地址)。
  • 大小、容量、分配器等元數據。

對比說明

操作行為時間復雜度元素是否移動
swap(member)交換內部指標與元數據O(1)否
swap(非成員函數)調用成員 swapO(1)否
賦值運算符 =逐元素拷貝/移動O(N)是

實際影響

  1. 性能優勢:交換兩個大型 vector 幾乎瞬間完成,無論元素數量多少。
  2. 迭代器有效性:swap 後,原指向元素的迭代器、引用、指標仍指向原來的元素(只是元素歸屬容器變了),不會失效(關聯容器除外,其迭代器隨容器交換而交換)。
  3. 異常安全:標準容器的 swap 承諾不拋出異常(noexcept),適合用於強異常安全保證的代碼模式(如 Copy-and-Swap 慣用法)。

遞歸交換的誤區

「不會遞歸交換數據結構裡面的字段」是指:如果容器存放的是指標或對象,swap 不會深入交換被指向的對象內容,也不會調用元素類型的 swap。它僅交換容器自身的「骨架」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved