📅  最后修改于: 2020-10-19 07:56:54             🧑  作者: Mango
C++ Multimultiset delete()函数用于从multiset容器中删除与给定键关联的单个元素或元素范围([first,last))。因此,将通过删除元素的数量来减小尺寸。
void erase (iterator position); //until C++ 11
size_type erase (const value_type& val); //until C++ 11
void erase (iterator first, iterator last); //until C++ 11
iterator erase (const_iterator position); //since C++ 11
size_type erase (const value_type& val); //since C++ 11
iterator erase (const_iterator first, const_iterator last); //since C++ 11
position:迭代器,指向要从容器中删除的元素。
val:要从multiset容器中删除的值。
第一:擦除范围的开始。
last:要擦除范围的末尾。
delete()函数返回一个迭代器,该迭代器指向已删除元素的下一个元素或返回已删除元素的数量。
擦除(位置):摊销常数。
擦除(值):容器大小的对数。
delete(first,last):容器的第一个和最后一个之间的距离呈线性。
迭代器,引用和指向该函数删除的元素的指针均无效,其他所有迭代器,指针和引用均保持其有效性。
容器已修改。
删除的元素将被修改。尽管同时访问其他元素是安全的,但容器中的迭代范围并不安全。
此函数不会引发异常。
如果指定了无效的范围或位置,则将导致未定义的行为。
让我们看一个简单的示例,该示例通过迭代器擦除元素。
#include
#include
using namespace std;
int main ()
{
multiset mymultiset;
multiset::iterator it;
mymultiset = {10,20,30,20};
cout<<"Before erasing the element: \n";
for (it=mymultiset.begin(); it!=mymultiset.end(); ++it)
cout << *it << '\n';
it=mymultiset.find('b');
mymultiset.erase (*it); // erasing by iterator
cout<<"\nAfter erasing the element: \n";
for (it=mymultiset.begin(); it!=mymultiset.end(); ++it)
cout << *it << '\n';
return 0;
}
输出:
Before erasing the element:
10
20
20
30
After erasing the element:
10
20
20
30
在上面的示例中,元素被迭代器“ it”擦除。
让我们看一个简单的示例,用给定的键值擦除multiset容器元素:
#include
#include
using namespace std;
int main ()
{
multiset mymultiset;
multiset::iterator it;
mymultiset = {10, 20, 30, 40, 10, 30};
cout<<"Before erasing the element: \n";
for (it=mymultiset.begin(); it!=mymultiset.end(); ++it)
cout << *it<< '\n';
mymultiset.erase (30); // erasing by value
cout<<"\nAfter erasing the element: \n";
for (it=mymultiset.begin(); it!=mymultiset.end(); ++it)
cout << *it<< '\n';
return 0;
}
输出:
Before erasing the element:
10
10
20
30
30
40
After erasing the element:
10
10
20
40
在上面的示例中,delete(value)函数使用多重集中的值30。
让我们看一个简单的示例,以给定范围擦除元素:
#include
#include
using namespace std;
int main ()
{
multiset mymultiset;
multiset::iterator it;
mymultiset = {10, 20, 30, 20};
cout<<"Before erasing the element are: \n";
cout<<"Size is: "<
输出:
Before erasing the element are:
Size is: 3
10
20
30
After erasing the element are:
Size is: 0
在上面的示例中,使用了Erase(first,last)函数来擦除具有给定范围(即开始到结束)的元素。
让我们看一个简单的示例,从multiset容器中删除所有奇数:
#include
#include
using namespace std;
int main()
{
multiset m = {1,2,3,4,5,6,7,8,9,10,11,12,11,10,4};
// erase all odd numbers from m
cout<<"After erasing odd numbers,elements are:\n ";
for(auto it = m.begin(); it != m.end(); )
if(*it % 2 == 1)
it = m.erase(it);
else
++it;
for(auto& p : m)
cout << p << ", ";
}
输出:
After erasing odd numbers, elements are:
2, 4, 4, 6, 8, 10, 10, 12,
在上面的示例中,所有奇数均已删除,并显示偶数。
让我们看另一个例子:
#include
#include
#include
#include // next() and prev() helper functions
using namespace std;
using mymultiset = multiset;
void printmultiset(const mymultiset& s) {
for (const auto& iter : s) {
cout << " [" << iter << "]";
}
cout << endl << "size() == " << s.size() << endl << endl;
}
int main()
{
mymultiset s1;
// Fill in some data to test with, one at a time
s1.insert("Bob");
s1.insert("Robert");
s1.insert("Rob");
s1.insert("Rob");
s1.insert("Bob");
cout << "Starting data of multiset s1 is:" << endl;
printmultiset(s1);
// The 1st member function removes an element at a given position
s1.erase(next(s1.begin()));
cout << "After the 2nd element is deleted, the multiset s1 is:" << endl;
printmultiset(s1);
// Fill in some data to test with, one at a time, using an intializer list
mymultiset s2{ "meow", "nikita", "nikita", "growl", "yellow" };
cout << "Starting data of multiset s2 is:" << endl;
printmultiset(s2);
// The 2nd member function removes elements
// in the range [First, Last)
s2.erase(next(s2.begin()), prev(s2.end()));
cout << "After the middle elements are deleted, the multiset s2 is:" << endl;
printmultiset(s2);
mymultiset s3;
// Fill in some data to test with, one at a time, using emplace
s3.emplace("C");
s3.emplace("C#");
s3.emplace("D");
s3.emplace("D#");
s3.emplace("E");
s3.emplace("E#");
s3.emplace("F");
s3.emplace("F#");
s3.emplace("G");
s3.emplace("G#");
s3.emplace("E");
s3.emplace("E#");
s3.emplace("B");
cout << "Starting data of multiset s3 is:" << endl;
printmultiset(s3);
// The 3rd member function removes elements with a given Key
mymultiset::size_type count = s3.erase("E#");
// The 3rd member function also returns the number of elements removed
cout << "The number of elements removed from s3 is: " << count << "." << endl;
cout << "After the element with a key of \"E#\" is deleted, the multiset s3 is:" << endl;
printmultiset(s3);
}
输出:
Starting data of multiset s1 is:
[Bob] [Bob] [Rob] [Rob] [Robert]
size() == 5
After the 2nd element is deleted, the multiset s1 is:
[Bob] [Rob] [Rob] [Robert]
size() == 4
Starting data of multiset s2 is:
[growl] [meow] [nikita] [nikita] [yellow]
size() == 5
After the middle elements are deleted, the multiset s2 is:
[growl] [yellow]
size() == 2
Starting data of multiset s3 is:
[B] [C] [C#] [D] [D#] [E] [E] [E#] [E#] [F] [F#] [G] [G#]
size() == 13
The number of elements removed from s3 is: 2.
After the element with a key of "E#" is deleted, the multiset s3 is:
[B] [C] [C#] [D] [D#] [E] [E] [F] [F#] [G] [G#]
size() == 11