zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    leetcode 29-> Divide Two Integers without using multiplication, division and mod operator
    ros topic 发布一次可能会接收不到数据
    python中的print()、str()和repr()的区别
    python 部分函数
    uiautomatorviewer错误 unable toconnect to adb
    pyqt 不规则形状窗口显示
    appium 计算器demo
    Spring 3.0 注解注入详解
    Spring Autowire自动装配
    restful 学习地址
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4571207.html
Copyright © 2011-2022 走看看