一、迭代器类型
前向迭代器特性
-
unordered_set 的迭代器属于前向迭代器(Forward Iterator),支持单向遍历操作:
auto it = s.begin(); while(it != s.end()) { std::cout << *it << " "; ++it; // 仅支持前置/后置递增操作 }
-
不支持双向操作(如–it)和 随机访问(如it + 5),这与 vector的随机访问迭代器 形成对比(注意: set 是双向迭代器,而unordered_ set 是单向迭代器)
二、哈希表修改影响
迭代器失效规则
操作类型 | 失效范围 | 触发条件 |
---|---|---|
插入元素 | 可能所有迭代器 | 触发rehash(负载因子>max_load_factor) |
删除元素 | 被删元素对应的迭代器 | 任何erase操作 |
reserve/rehash | 所有迭代器 | 显式调用或自动扩容 |
危险操作示例
std::unordered_set<int> s{1,2,3};
auto it = s.find(2);
s.insert(4); // 可能使it失效
std::cout << *it; // 未定义行为
三、安全操作建议
-
在遍历时修改容器的正确模式:
for(auto it = s.begin(); it != s.end();) { if(condition(*it)) { it = s.erase(it); // C++11起erase返回下一有效迭代器 } else { ++it; } }
-
插入元素后应重新获取迭代器,避免类似uthash需要手动维护指针的情况