乐闻世界logo
搜索文章和话题

What happens if you call erase() on a map element while iterating from begin to end?

2 个月前提问
2 个月前修改
浏览次数26

1个答案

1

在C++中,如果您在迭代过程中对map元素调用erase()函数,需要非常小心,因为这可能会导致迭代器失效,进而引发未定义行为。

具体来说,当你从std::map中删除一个元素时,指向该元素的迭代器(包括该元素的迭代器)会立即失效。这意味着,如果你在循环中不正确地使用erase(),在删除元素后继续使用旧迭代器,可能会导致程序崩溃或者其他错误。

正确的做法是在调用erase()时更新迭代器。erase()函数返回一个指向被删除元素下一个元素的迭代器,可以利用这一点安全地继续迭代。下面是一个例子:

cpp
#include <iostream> #include <map> int main() { std::map<int, std::string> myMap; // 初始化map myMap[1] = "one"; myMap[2] = "two"; myMap[3] = "three"; // 安全地删除元素 for (auto it = myMap.begin(); it != myMap.end(); ) { if (it->first == 2) { it = myMap.erase(it); // erase()之后更新迭代器 } else { ++it; // 正常迭代 } } // 输出剩余的元素 for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; }

在这个例子中,我们从std::map中安全地删除了键为2的元素。注意我们没有在erase()调用之后再次使用旧的迭代器,而是直接使用erase()返回的迭代器继续循环。这样可以保证迭代器始终有效且指向正确的元素,从而避免了潜在的错误或崩溃。

2024年7月17日 10:28 回复

你的答案