C ++ set erase()函数用于从set容器中删除与给定键关联的单个元素或元素范围([first,last))。因此,将通过删除元素的数量来减小大小。
void erase (iterator position); //C++ 11 之前 size_type erase (const value_type& val); //C++ 11 之前 void erase (iterator first, iterator last); //C++ 11 之前 iterator erase (const_iterator position); //从 C++ 11开始 size_type erase (const value_type& val); //从 C++ 11开始 iterator erase (const_iterator first, const_iterator last); //从 C++ 11开始
position:迭代器,指向要从集合中删除的单个元素。
val:要从集合中删除的值。
first:要擦除范围的开始。
last:要擦除范围的末尾。
它返回一个指向已删除元素的下一个元素的迭代器,或者返回已删除元素的数量。
erase(position):摊销常数。
erase (val):容器大小的对数。
erase(first,last):第一个和最后一个的距离是线性的。
迭代器,引用和指向该函数删除的元素的指针均无效。
所有其他迭代器,指针和引用均保持其有效性。
容器已修改。
删除的元素将被修改。尽管同时访问其他元素是安全的,但在容器中进行迭代范围并不安全。
此函数不会引发异常。
如果指定了无效的范围或位置,则将导致未定义的行为。
让我们看一个简单的示例,该示例通过迭代器擦除元素。
#include <iostream> #include <set> using namespace std; int main () { set<int> myset; set<int>::iterator it; myset = { 10,20,30 } ; cout<<"删除元素之前: \n"; for (it=myset.begin(); it!=myset.end(); ++it) cout << *it << '\n'; it=myset.find('b'); myset.erase (*it); // erasing by iterator cout<<"\n删除元素后: \n"; for (it=myset.begin(); it!=myset.end(); ++it) cout << *it << '\n'; return 0; }
输出:
删除元素之前: 10 20 30 删除元素后: 10 20 30
在上面的示例中,元素被迭代器删除。
让我们看一个简单的示例,用给定的键值删除集合中的元素:
#include <iostream> #include <set> using namespace std; int main () { set<int> myset; set<int>::iterator it; myset = {10, 20, 30, 40}; cout<<"删除元素之前: \n"; for (it=myset.begin(); it!=myset.end(); ++it){ cout << *it<< '\n'; } myset.erase (30);//删除指定值 cout<<"\n删除元素之后: \n"; for (it=myset.begin(); it!=myset.end(); ++it){ cout << *it<< '\n'; } return 0; }
输出:
删除元素之前: 10 20 30 40 删除元素之后: 10 20 40
在上面的示例中,erase (value)函数使用集合中的值30。
让我们看一个简单的示例,以给定范围擦除元素:
#include <iostream> #include <set> using namespace std; int main () { set<int> myset; set<int>::iterator it; myset = { 10, 20, 30 }; cout<<"删除元素之前: \n"; cout<<"Size is: "<<myset.size()<<'\n'; for (it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } myset.erase ( myset.begin () , myset.end () ); // 擦除指定范围 cout<<"\n删除元素之后: \n"; cout<<"Size is: "<<myset.size(); for (it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } return 0; }
输出:
删除元素之前: Size is: 3 10 20 30 删除元素之后: Size is: 0
在上面的示例中,使用了Erase(first,last)函数来擦除具有给定范围(即开始到结束)的元素。
让我们看一个简单的示例,以删除集合中的所有奇数:
#include <set> #include <iostream> using namespace std; int main() { set<int> m = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; // 从m删除所有奇数 cout<<"删除奇数后,元素是:\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 << ", "; } }
输出:
删除奇数后,元素是: 2, 4, 6, 8, 10, 12, 14,
在上面的示例中,所有奇数均已删除,并显示偶数。
让我们看另一个实例:
#include <set> #include <string> #include <iostream> #include <iterator> // next()和prev()辅助函数 using namespace std; using myset = set<string>; void printset(const myset& s) { for (const auto& iter : s) { cout << " [" << iter << "]"; } cout << endl << "size() == " << s.size() << endl << endl; } int main() { myset s1; // 填入一些数据进行测试,一次一个 s1.insert("Bob"); s1.insert("Robert"); s1.insert("Bert"); s1.insert("Rob"); s1.insert("Bobby"); cout << "集合s1的起始数据为:" << endl; printset(s1); // 第一个成员函数删除给定位置的元素 s1.erase(next(s1.begin())); cout << "删除第2个元素后,集合s1为:" << endl; printset(s1); // 使用初始化器列表一次填入一个要测试的数据 myset s2{ "meow", "hiss", "purr", "growl", "yowl" }; cout << "集合s2的起始数据为:" << endl; printset(s2); // 第二个成员函数删除元素 // 范围 [First, Last) s2.erase(next(s2.begin()), prev(s2.end())); cout << "删除中间元素后,集合s2为:" << endl; printset(s2); myset s3; // 使用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("A"); s3.emplace("A#"); s3.emplace("B"); cout << "集合s3的开始数据为:" << endl; printset(s3); // 第三个成员函数删除具有给定键的元素 myset::size_type count = s3.erase("E#"); // 第三个成员函数也返回被删除的元素数量 cout << "从s3中删除的元素数量为: " << count << "." << endl; cout << "删除键为“ E#”的元素后,集合s3为:" << endl; printset(s3); }
输出:
集合s1的起始数据为: [Bert] [Bob] [Bobby] [Rob] [Robert] size() == 5 删除第2个元素后,集合s1为: [Bert] [Bobby] [Rob] [Robert] size() == 4 集合s2的起始数据为: [growl] [hiss] [meow] [purr] [yowl] size() == 5 删除中间元素后,集合s2为: [growl] [yowl] size() == 2 集合s3的开始数据为: [A] [A#] [B] [C] [C#] [D] [D#] [E] [E#] [F] [F#] [G] [G#] size() == 13 从s3中删除的元素数量为: 1. 删除键为“ E#”的元素后,集合s3为: [A] [A#] [B] [C] [C#] [D] [D#] [E] [F] [F#] [G] [G#] size() == 12