- C++ map 删除元素
- 删除map所有元素的错误代码
- 删除map所有元素的正确代码
- 删除map中指定元素的错误代码
- 删除map中指定元素的正确代码
C++中map删除元素,方式不对就会引起cannot dereference value-initialized map/set iterator的bug
删除map所有元素的错误代码std::mapmapPerson; mapPerson.insert(pair (1, "Jim")); mapPerson.insert(pair (2, "Kim")); mapPerson.insert(pair (3, "LaoWang")); for (auto i = mapPerson.begin();i != mapPerson.end();i++) { mapPerson.erase(i->first); }
这样的代码必然会引起崩溃,因为一旦删除了,再进行i++操作就会崩溃
删除map所有元素的正确代码mapPerson.erase(mapPerson.begin(), mapPerson.end());//方法一
mapPerson.clear();//方法二 值为指针不要直接用可以先释放指针内存后用
方法二释放内存版
for (auto it = mapPerson.begin(); it != mapPerson.end();)//方法二 释放内存
{
delete it->second;
it->second = nullptr;
it++;
}
mapPerson.clear();//释放内存后再清除
for (auto it = mapPerson.begin(); it != mapPerson.end();)//方法三
{
// 删除迭代器元素先++再删,否则迭代器失效程序崩溃(必须it++不可++it)
mapPerson.erase(it++);
}
删除map中指定元素的错误代码
std::map删除map中指定元素的正确代码mapPerson; mapPerson.insert(pair (1, "Jim")); mapPerson.insert(pair (2, "Kim")); mapPerson.insert(pair (3, "LaoWang")); for (auto it = mapPerson.begin(); it != mapPerson.end();it++) { if (it->first == 2) { mapPerson.erase(it);//这里要写成 it=mapPerson.erase(it) } }
C++11之后这两种写法都没问题
for (auto it = mapPerson.begin(); it != mapPerson.end();it++)
{
if (it->first == 2)
{
it=mapPerson.erase(it);
}
}
或者这样写也行:
for (auto it = mapPerson.begin(); it != mapPerson.end();)
{
if (it->first == 2)
{
it=mapPerson.erase(it);
}
else
{
//这里++在前或者在后无影响
//不过在C++11之后,erase(it)之后会返回下一个迭代器;不需要递增也可以
it++;
}
}



