正向迭代器可以正常使用erase操作,进行删除操作。但是反向迭代器如果直接使用erase传递一个反向迭代器的参数会报错,但是他们是继承的关系,所以可以使用base()进行转换已达到删除的目的。 即使用 (++it).base()作为erase的参数。
multimap<int, int> mm;
mm.insert(make_pair(3, 2));
mm.insert(make_pair(3, 1));
mm.insert(make_pair(1, 4));
mm.insert(make_pair(2, 3));
for (auto it : mm)
{
cout << it.first << "---" << it.second << endl;
}
cout << "----------" << endl;
for (auto it = mm.rbegin(); it != mm.rend(); ++it)
{
if (it->second == 2)
{
mm.erase((++it).base());
break;
}
}
for (auto it : mm)
{
cout << it.first << "---" << it.second << endl;
}
这是一种很机智的方法,当然再找到这个方法之前,总不能被卡主,想想还有没有其他的方法。有的,那就是将所有的键值数据全部保存,然后删除需要删除的元素即可。例:multimap的数据 <1,2><1,3><1,4><2,3><3,4><3,3>要删除<3,4>,原本可以使用正向迭代器删除,但是如果数据量特别大,或者就必须使用反向迭代器呢?使用反向迭代器将所有键值为3的都删除,前提是将键值为3的数据保存起来,然后再将保存的数据重新写入。
multimap<int, int> mapTmp;
mapTmp.insert(make_pair(3, 2));
mapTmp.insert(make_pair(3, 1));
mapTmp.insert(make_pair(1, 4));
mapTmp.insert(make_pair(2, 3));
for (auto it : mapTmp)
{
cout << it.first << "---" << it.second << endl;
}
cout << "------" << endl;
auto it = mapTmp.rbegin();
multimap<int, int>::size_type cnt = mapTmp.count(it->first);
int x = cnt;
vector<int> veTmp(cnt+1);
int ii = 0;
for (; cnt > 0; cnt--, it++)
{
//veTmp.push_back(it->second);
veTmp[ii++] = it->second;
}
--it;
int tmp = it->first;
mapTmp.erase(it->first);
for (int i = 0; i < x - 1; ++i)
{
mapTmp.insert(make_pair(tmp,veTmp[i]));
}
for (auto it : mapTmp)
{
cout << it.first << "---" << it.second << endl;
}
好蠢的办法啊。。。
关于反向迭代器删除的详细信息,可以参考这位大佬的文章,感谢大佬分享。
https://blog.csdn.net/onlysingleboy/article/details/74504266