std::map增删操作后,其内部std::list的迭代器是否仍有效?
关于std::map内部std::list迭代器有效性的问题
核心结论:只要不删除该list所在的std::map节点,指向内部std::list的迭代器就始终有效。
原因分析
std::map底层基于红黑树实现,插入、删除操作仅会修改红黑树的节点结构,不会移动或销毁已有节点中存储的std::list对象——每个map节点的内存独立存在,增删其他节点不会影响目标list的存续状态。std::list的迭代器有效性仅与自身元素的增删有关,只要list对象本身未被销毁,迭代器就不会因外层map的其他操作失效。
分场景验证
- 场景1:向map插入新键值对
比如执行my_map.insert({1, {4.4, 5.5}}),原键0对应的list未被触碰,迭代器it依然有效,可正常访问指向的元素。 - 场景2:删除map中其他键的节点
比如执行my_map.erase(1),键0对应的list完好无损,迭代器it依然有效。 - 场景3:删除map中目标键的节点
比如执行my_map.erase(0),此时键0对应的list对象被销毁,所有指向它的迭代器都会失效,后续使用会触发未定义行为。
示例代码
std::map<int, std::list<double>> my_map; my_map[0] = {1.1, 2.2, 3.3}; auto it = my_map[0].begin(); // 指向list中1.1的迭代器 // 插入新节点,it有效 my_map.insert({1, {4.4,5.5}}); std::cout << *it << std::endl; // 输出1.1 // 删除非目标节点,it有效 my_map.erase(1); std::cout << *it << std::endl; // 输出1.1 // 删除目标节点,it失效 my_map.erase(0); // std::cout << *it << std::endl; // 未定义行为,禁止执行
内容的提问来源于stack exchange,提问作者Alexander Richter
相关产品推荐
相关产品推荐

