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中文网其他相关文章!