如何在反向迭代std::multimap时删除元素?
如何在反向迭代
std::multimap时删除元素? 正向迭代std::multimap时删除元素的逻辑很直接,但反向迭代时需要额外处理——因为multimap::erase的返回值是正向迭代器,无法直接赋值给循环中使用的反向迭代器。
解决思路
反向迭代器提供了base()方法,可以将其转换为对应的正向迭代器,但要注意两者的位置关系:反向迭代器rit指向的元素,对应的正向迭代器rit.base()指向的是rit的下一个元素。利用这一点,我们可以通过正向迭代器完成删除操作,再将返回的新正向迭代器重新转换为反向迭代器,维持循环的正确遍历。
代码示例
#include <map> #include <string> #include <iostream> int main() { std::multimap<int, std::string> my_map = {{1, "a"}, {2, "b"}, {2, "c"}, {3, "d"}}; // 反向迭代遍历 for (auto rit = my_map.rbegin(); rit != my_map.rend(); ) { // 假设删除键为2的元素 if (rit->first == 2) { // 将反向迭代器转为正向迭代器 auto fit = rit.base(); // 执行删除,得到删除元素的下一个正向迭代器 fit = my_map.erase(fit); // 将新的正向迭代器转回反向迭代器,赋值给rit rit = std::reverse_iterator<decltype(fit)>(fit); } else { // 无需删除时,正常移动反向迭代器 ++rit; } } // 验证结果 for (const auto& pair : my_map) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; }
关键说明
- 不能直接在删除后对原反向迭代器执行
++rit,因为删除操作会使当前反向迭代器失效。 erase返回的正向迭代器指向被删除元素的下一个位置,将其转换为反向迭代器后,正好对应反向遍历的下一个有效位置,保证循环可以继续正确执行。
内容的提问来源于stack exchange,提问作者user1201614
相关产品推荐
相关产品推荐

