Pet*_*ter 15 c++ stl map c++11
我的STL有点生疏,请原谅我提出一个可能微不足道的问题.考虑以下代码:
map<int,int> m;
...
for (auto itr = m.begin(); itr != m.end(); ++itr) {
if (itr->second == 0) {
m.erase(itr);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:在循环地图时擦除元素是否安全?
Eri*_*rik 23
是的,但不是你这样做的方式.擦除时会使itr无效,然后递增无效迭代器.
auto itr = m.begin();
while (itr != m.end()) {
if (itr->first == 0) {
m.erase(itr++);
} else {
++itr;
}
}
Run Code Online (Sandbox Code Playgroud)
XAd*_*der 11
我认为你根本不应该使用删除的迭代器 - 如果列表导致严重的问题,那么对于地图来说应该不同.
由Matthieu M 编辑:此代码在C++ 0x中格式良好,并允许作为MSVC的扩展.
map<int,int> m;
...
auto itr = m.begin();
while (itr != m.end())
{
if (itr->second == 0) {
itr = m.erase(itr);
}
else
{
itr++;
}
}
Run Code Online (Sandbox Code Playgroud)
对于给出的示例,实际上更容易使用将键作为参数的擦除重载.此函数使用给定键擦除地图中的所有元素(对于地图,此值始终为零或一个元素)
map<int,int> m;
// ...
m.erase(0); // erase all elements with key equivalent to 0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20089 次 |
最近记录: |