C++ multimap.erase()函数
C++ multimap erase() 函数用于从multimap容器中删除与给定键值关联的单个元素或一组元素。因此,大小将减少所删除的元素数。
语法
void erase (iterator position); //until C++ 11
size_type erase (const key_type& k); //until C++ 11
void erase (iterator first, iterator last); //until C++ 11
iterator erase (const_iterator position); //since C++ 11
size_type erase (const key_type& k); //since C++ 11
iterator erase (const_iterator first, const_iterator last); //since C++ 11
参数
position :指向从multimap中移除的单个元素的迭代器。
k :要从multimap中移除的元素的键。
first :要擦除的范围的开始位置。
last :要擦除的范围的结束位置。
返回值
它返回一个指向被删除元素的下一个元素的迭代器,或者返回被删除的元素数量。
复杂度
erase(position) :摊销常数。
erase(val) :对数与容器大小成比例。
erase(first, last) :与first和last之间的距离成线性比例。
迭代器有效性
由函数删除的元素的迭代器,引用和指针将失效。
所有其他迭代器,指针和引用保持有效。
数据竞争
容器被修改。
被删除的元素被修改。虽然同时访问其他元素是安全的,但在容器中迭代范围不安全。
异常安全
此函数不会抛出异常。
如果指定了无效的范围或位置,会导致未定义行为。
示例1
让我们看一个简单的示例,通过迭代器擦除元素。
#include <iostream>
#include <map>
using namespace std;
int main ()
{
multimap<char,int> mymultimap;
multimap<char,int>::iterator it;
mymultimap= {
{'a', 100},
{'b', 200},
{'b', 300},
{'c', 400}
};
cout<<"Before erasing the element: \n";
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
it=mymultimap.find('b');
mymultimap.erase (it); // erasing by iterator
cout<<"\nAfter erasing the element: \n";
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
return 0;
}
输出:
Before erasing the element:
a => 100
b => 200
b => 300
c => 400
After erasing the element:
a => 100
b => 300
c => 400
在上面的示例中,元素被迭代器it删除。
示例2
让我们看一个简单的示例,通过给定的键值从multimap中删除元素:
#include <iostream>
#include <map>
using namespace std;
int main ()
{
multimap<char,int> mymultimap;
multimap<char,int>::iterator it;
mymultimap = {
{'a', 100},
{'b', 200},
{'b', 300},
{'c', 400}
};
cout<<"Before erasing the element: \n";
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
mymultimap.erase ('b'); // erasing by key
cout<<"\nAfter erasing the element: \n";
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
return 0;
}
输出:
Before erasing the element:
a => 100
b => 200
b => 300
c => 400
After erasing the element:
a => 100
c => 400
在上面的示例中,erase(key)函数会擦除multimap中所有键为’b’的键值对。
示例3
让我们看一个简单的示例来按给定范围擦除元素:
#include <iostream>
#include <map>
using namespace std;
int main ()
{
multimap<char,int> mymultimap;
multimap<char,int>::iterator it;
mymultimap = {
{'a', 100},
{'b', 200},
{'b', 300},
{'c', 400}
};
cout<<"Before erasing the element are: \n";
cout<<"Size is: "<<mymultimap.size()<<'\n';
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
cout << it->first << " => " << it->second << '\n';
mymultimap.erase ( mymultimap.begin () , mymultimap.end () ); // erasing by range
cout<<"\nAfter erasing the element are: \n";
cout<<"Size is: "<<mymultimap.size();
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
cout << it->first << " => " << it->second << '\n';
return 0;
}
输出:
Before erasing the element are:
Size is: 4
a => 100
b => 200
b => 300
c => 400
After erasing the element are:
Size is: 0
在上面的示例中,使用erase(首,尾)函数来删除给定范围的元素,即从开始到结束。
示例4
让我们看一个简单的示例,从multimap中删除所有奇数:
#include <map>
#include <iostream>
using namespace std;
int main()
{
multimap<int, string> m = { {1, "one"},
{2, "two"},
{3, "three"},
{4, "four"},
{5, "five"},
{6, "six"}
};
// erase all odd numbers from m
cout<<"After erasing odd numbers,elements are:\n ";
for(auto it = m.begin(); it != m.end(); )
if(it->first % 2 == 1)
it = m.erase(it);
else
++it;
for(auto& p : m)
cout <<p.first <<", "<< p.second << "\n ";
}
输出:
After erasing odd numbers, elements are:
2, two
4, four
6, six
在上面的示例中,所有的奇数已经被删除,只显示偶数。