《C++ Primer》第 5 版第 303 頁提到:「swap 只是交換了兩個容器的內部數據結構」。許多讀者對此感到困惑:這究竟意味著什麼?是淺拷貝還是深拷貝?
這句話描述的是 常數時間復雜度 O(1) 的交換機制。標準庫容器(如 vector、list、map 等)的 swap 成員函數不會逐個元素拷貝或移動,而是直接交換容器對象內部的幾個關鍵指標/元數據:
| 操作 | 行為 | 時間復雜度 | 元素是否移動 |
|---|---|---|---|
| swap(member) | 交換內部指標與元數據 | O(1) | 否 |
| swap(非成員函數) | 調用成員 swap | O(1) | 否 |
| 賦值運算符 = | 逐元素拷貝/移動 | O(N) | 是 |
「不會遞歸交換數據結構裡面的字段」是指:如果容器存放的是指標或對象,swap 不會深入交換被指向的對象內容,也不會調用元素類型的 swap。它僅交換容器自身的「骨架」。