阅读 1920

C++ set erase() 使用方法及示例

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):第一个和最后一个的距离是线性的。

迭代器有效性

迭代器,引用和指向该函数删除的元素的指针均无效。

所有其他迭代器,指针和引用均保持其有效性。

数据争用

容器已修改。

删除的元素将被修改。尽管同时访问其他元素是安全的,但在容器中进行迭代范围并不安全。

异常安全

此函数不会引发异常。

如果指定了无效的范围或位置,则将导致未定义的行为。

实例1

让我们看一个简单的示例,该示例通过迭代器擦除元素。

示例

#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;
}

输出:

删除元素之前: 102030删除元素后: 102030

在上面的示例中,元素被迭代器删除。

实例2

让我们看一个简单的示例,用给定的键值删除集合中的元素:

示例

#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;
}

输出:

删除元素之前: 10203040删除元素之后: 102040

在上面的示例中,erase (value)函数使用集合中的值30。

实例3

让我们看一个简单的示例,以给定范围擦除元素:

示例

#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: 3102030删除元素之后: Size is: 0

在上面的示例中,使用了Erase(first,last)函数来擦除具有给定范围(即开始到结束)的元素。

实例4

让我们看一个简单的示例,以删除集合中的所有奇数:

示例

#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,

在上面的示例中,所有奇数均已删除,并显示偶数。

实例5

让我们看另一个实例:

示例

#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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐