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

C++ 迭代器與容器關係本質:模板協議、失效機制與正確使用模式

     編輯:程式設計綜合問答

核心關係

迭代器是模板協議的抽象介面,容器遵循標準提供 begin()/end() 返回符合協議的迭代器類型。兩者無運行時綁定,純編譯期靜態多態。

代碼解讀


set actors1, actors2, result;
set::iterator it; // 1. 僅聲明迭代器變量,未綁定任何容器
copy(actors1.begin(), actors1.end(), inserter(result, result.begin()));
// 2. copy 內部使用 actors1 的迭代器遍歷,result 的插入迭代器寫入
  • set::iterator 是 set 內部定義的**巢狀類型**,編譯器知道它如何遍歷紅黑樹節點。
  • 迭代器構造時內部持有**節點指標**,非容器指標。

迭代器失效規則 (關鍵)

原則:修改容器結構 (節點分配/釋放/移動) 後,**必須重新獲取迭代器**,舊迭代器指向的記憶體可能已無效。

正確使用模式


// 遍歷中刪除 - 正確
for (auto it = vec.begin(); it != vec.end(); ) {
    if (shouldErase(*it)) it = vec.erase(it); // erase 返回下一個有效迭代器
    else ++it;
}

// 範圍插入後重新獲取
vec.insert(pos, new_elements);
auto new_it = vec.begin() + offset; // 重新計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作vectorlist/dequeset/map (RB-tree)
insert/emplace可能失效 (擴容)不失效不失效
erase失效 (被刪及之後)僅被刪失效僅被刪失效
resize/reserve可能失效--