• STL --> set用法


    set用法

    一、set和multiset基础

      set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。


    需要包含头文件:

    #include <set>

    二、创建元素

    set<int> s1;                    //创建空的set对象,元素类型为int,
    set<const char*, strLess> s2( strLess);     //创建空的set对象,元素类型char*,比较函数对象(即排序准则)为自定义strLess
    set<int> s3(s1);                  //利用set对象s1,拷贝生成set对象s2
    int iArray[] = {13, 32, 19};
    set<int> s4(iArray, iArray + 3);         //用迭代区间[&first, &last)所指的元素,创建一个set对象
    const char* szArray[] = {"hello", "dog", "bird" };
    set<const char*, strLess> s5(szArray, szArray + 3, strLess() );    //用迭代区间[&first, &last)所指的元素,及比较函数对象strLess,创建一个set对象

    三、插入元素

    set<string> set1;    //empty set
    set1.insert("the");   //set1 now has one element
    set1.insert("and");   //set1 now has two elements
    set<int> set2; //empty set set2.insert(iset.begin(), iset.end()); //set2 now has 10 elements

    例如:

    // set::insert (C++98)
    #include <iostream>
    #include <set>
    
    int main ()
    {
      std::set<int> myset;
      std::set<int>::iterator it;
      std::pair<std::set<int>::iterator,bool> ret;
    
      // set some initial values:
      for (int i=1; i<=5; ++i) myset.insert(i*10);    // set: 10 20 30 40 50
    
      ret = myset.insert(20);               // no new element inserted
    
      if (ret.second==false) it=ret.first;  // "it" now points to element 20
    
      myset.insert (it,25);                 // max efficiency inserting
      myset.insert (it,24);                 // max efficiency inserting
      myset.insert (it,26);                 // no max efficiency inserting
    
      int myints[]= {5,10,15};              // 10 already in set, not inserted
      myset.insert (myints,myints+3);
    
      std::cout << "myset contains:";
      for (it=myset.begin(); it!=myset.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '
    ';
    
      return 0;
    }

    结果:

    myset contains: 5 10 15 20 24 25 26 30 40 50

     四、删除元素

    // erasing from set
    #include <iostream>
    #include <set>
    
    int main ()
    {
      std::set<int> myset;
      std::set<int>::iterator it;
    
      // insert some values:
      for (int i=1; i<10; i++) myset.insert(i*10);  // 10 20 30 40 50 60 70 80 90
    
      it = myset.begin();
      ++it;                                         // "it" points now to 20
    
      myset.erase (it);
      myset.erase (40);
    
      it = myset.find (60);
      myset.erase (it, myset.end());
    
      std::cout << "myset contains:";
      for (it=myset.begin(); it!=myset.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '
    ';
    
      return 0;
    }

    结果:

    myset contains: 10 30 50

    五、查找元素

    iset.find(1);     //returns iterator that refers to the element with key==1
    iset.find(11);   //returns iterator == iset.end()
    iset.count(1); //returns 1; iset.count(11); //returns 0; //set_it refers to the element with key==1 set<int>::iterator set_it = iset.find(1); *set_it=11; //error: keys in a set are read-only cout<<*set_it<<endl; //ok: can read the key

    例如:

    // set::find
    #include <iostream>
    #include <set>
    
    int main ()
    {
      std::set<int> myset;
      std::set<int>::iterator it;
    
      // set some initial values:
      for (int i=1; i<=5; i++) myset.insert(i*10);    // set: 10 20 30 40 50
    
      it=myset.find(20);
      myset.erase (it);
      myset.erase (myset.find(40));
    
      std::cout << "myset contains:";
      for (it=myset.begin(); it!=myset.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '
    ';
    
      return 0;
    }

    结果:

    myset contains: 10 30 50

     六、其他

        #include <iostream>  
        #include <set>  
        using namespace std;  
          
        int main()  
        {  
            typedef set<int,greater<int> > IntSet;  
            IntSet s1;  
          
            s1.insert(4);  
            s1.insert(3);  
            s1.insert(5);  
            s1.insert(1);  
            s1.insert(6);  
            s1.insert(2);  
            s1.insert(5);  
            //the inserted element that has the same value with a element existed is emitted  
          
            copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," "));  
            cout << endl << endl;  
          
            pair<IntSet::iterator,bool> status = s1.insert(4);  
            if(status.second)  
                cout << "4 is inserted as element "  
                << distance(s1.begin(),status.first) + 1 << endl;  
            else  
                cout << "4 already exists in s1" << endl;  
            copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," "));  
            cout << endl << endl;  
          
            set<int>  s2(s1.begin(),s1.end());//default sort criterion is less<  
            copy(s2.begin(),s2.end(),ostream_iterator<int>(cout," "));  
            cout << endl << endl;  
        }  

    上述程序最后新产生一个set:s2,默认排序准则是less。以s1的元素作为初值。

    注意:s1和s2有不同的排序准则,所以他们的型别不同,不能直接进行相互赋值或比较。

    运行结果:

    6 5 4 3 2 1 
    
    4 already exist in s1
    6 5 4 3 2 1 
    
    1 2 3 4 5 6
  • 相关阅读:
    排序算法说明
    easyExcel 读写excel表格
    POI 读写excel表格
    JVM虚拟机详解
    SSM相关的配置文件模板
    SSM 统一异常处理
    ssm框架实现发送邮件
    springboot发送邮件
    SpringBoot Ajax请求Json数据
    协程(Coroutine)(二)
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4571207.html
Copyright © 2020-2023  润新知