C++ 容器庫提供以下機制確保迭代器的安全性:1. 容器不變性保證;2. 複製迭代器;3. 範圍 for 迴圈;4. Const 迭代器;5. 異常安全。
在 C++ 中,容器庫提供了迭代器,允許我們遍歷容器中的元素。為了防止迭代期間容器的意外修改,C++ 容器庫提供了多項機制確保迭代器的安全性。
1. 容器不變性保證
當一個容器處於有效狀態時,它的內容、大小和元素順序是確定的。容器庫確保在迭代期間保持此不變性。當嘗試向迭代的容器新增或刪除元素時,迭代器會失效。例如:
std::vector<int> v{1, 2, 3}; for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { v.push_back(4); // 迭代器无效,引用不再有效 }
2. 複製迭代器
在 C++ 中,迭代器可以複製,建立指向相同元素的新迭代器。這允許我們建立迭代器的副本,並在容器發生意外修改時繼續使用它們。複製迭代器不受原始容器的修改的影響,即使原始容器已更改或失效。
3. 範圍for 迴圈
範圍for 迴圈隱含使用複製迭代器,允許我們遍歷容器中的元素,而不必擔心容器的修改會影響迭代。
for (int& elem : v) { // 使用 elem... v.push_back(4); // 不会影响范围 for 循环 }
4. Const 迭代器
const 迭代器指涉容器中的唯讀元素。嘗試透過 const 迭代器修改容器將導致編譯時錯誤。這確保了遍歷容器時資料的完整性。
5. 異常安全
容器庫在迭代期間偵測異常,並自動在異常拋出時使迭代器失效。這防止了對損壞容器的存取。
實戰案例:安全地從映射中刪除元素
std::map
是一個有序關聯容器,允許我們根據鍵查找值。在迭代映射時,如果我們嘗試刪除當前迭代的元素,迭代器將失效,因為底層映射已更改。為了安全地刪除元素,我們可以使用 erase
方法,該方法傳回一個指向已刪除元素後繼的新的有效迭代器。
std::map<int, int> m{{1, 10}, {2, 20}, {3, 30}}; for (auto it = m.begin(); it != m.end(); ) { if (it->second % 2 == 0) { it = m.erase(it); // 返回新的有效迭代器 } else { ++it; } }
以上是C++ 容器庫的迭代器安全性的保證的詳細內容。更多資訊請關注PHP中文網其他相關文章!