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

C++ vector 首位插入導致位址改變:擴容時重新分配並移動所有元素

     編輯:程式設計疑難解答

vector::insert(begin(), val) 在開頭插入元素,若容量足夠,現有元素向後移動 (位址改變);若容量不足,**觸發擴容**:分配新記憶體 (通常 2x),**將所有舊元素複製/移動到新記憶體**,釋放舊記憶體,**vector 內部指標 (首位址) 徹底改變**。

觀察位址變化

vector v = {1,2,3};
cout << v.data(); // 0x1000
v.insert(v.begin(), 0); // 可能擴容
cout << v.data(); // 可能變為 0x2000 (新記憶體塊)

關鍵點

  • 迭代器/指標/引用失效:任何指向 vector 元素的迭代器、指標、引用在擴容後全部失效。
  • 保留策略:v.reserve(n) 預先分配容量,避免頻繁擴容移動。
  • 首位插入效能差:O(N) 移動 + 可能擴容。頻繁首位操作請用 deque (O(1) 雙端) 或 list (O(1) 插入)。

正確預期

「vector 首位址**不穩定**,擴容時會改變。僅在容量足夠且無擴容時,首位址不變,但元素仍會整體後移。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved