核心關係
迭代器是模板協議的抽象介面,容器遵循標準提供 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 內部定義的**巢狀類型**,編譯器知道它如何遍歷紅黑樹節點。
- 迭代器構造時內部持有**節點指標**,非容器指標。
迭代器失效規則 (關鍵)
| 操作 | vector | list/deque | set/map (RB-tree) |
| insert/emplace | 可能失效 (擴容) | 不失效 | 不失效 |
| erase | 失效 (被刪及之後) | 僅被刪失效 | 僅被刪失效 |
| resize/reserve | 可能失效 | - | - |
原則:修改容器結構 (節點分配/釋放/移動) 後,**必須重新獲取迭代器**,舊迭代器指向的記憶體可能已無效。
正確使用模式
// 遍歷中刪除 - 正確
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; // 重新計算
- 上一篇文章: <xTitle>Hibernate 連接 MySQL 失敗:權限問題排查與 root 密碼驗證
- 下一篇文章: <xTitle>C++ multiset 迭代器類別:雙向迭代器,不支援隨機存取與前向寫入
Copyright ©
程式碼之家 All Rights Reserved