zoukankan      html  css  js  c++  java
  • STL:set/multiset用法详解

    集合

    使用set或multiset之前,必须加入头文件<set>

    Set、multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素。


    sets和multiset内部以平衡二叉树实现



    1.   常用函数

    1)        构造函数和析构函数

    set c:创建空集合,不包含任何元素

    set c(op):以op为排序准则,产生一个空的set

    set c1(c2):复制c2中的元素到c1中

    set c(const value_type *first, const value_type* last):复制[first, last)之间元素构成新集合

    set c(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新集合。

    c.~set()销毁所有元素,释放内存

    multiset mc:创建空集合,不包含任何元素

    multiset mc(op):以op为排序准则,产生一个空的set

    multiset c1(c2):复制c2中的元素到c1中

    multiset c(const value_type *first, const value_type* last):复制[first, last)之间元素构成新集合

    multiset c(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新集合。

    c.~set()销毁所有元素,释放内存

    1. // constructing sets  
    2. #include <iostream>  
    3. #include <set>  
    4.   
    5. bool fncomp (int lhs, int rhs) {return lhs<rhs;}  
    6.   
    7. struct classcomp {  
    8.   bool operator() (const int& lhs, const int& rhs) const  
    9.   {return lhs<rhs;}  
    10. };  
    11.   
    12. int main ()  
    13. {  
    14.   std::set<int> first;                           // empty set of ints  
    15.   
    16.   int myints[]= {10,20,30,40,50};  
    17.   std::set<int> second (myints,myints+5);        // range  
    18.   
    19.   std::set<int> third (second);                  // a copy of second  
    20.   
    21.   std::set<int> fourth (second.begin(), second.end());  // iterator ctor.  
    22.   
    23.   std::set<int,classcomp> fifth;                 // class as Compare  
    24.   
    25.   bool(*fn_pt)(int,int) = fncomp;  
    26.   std::set<int,bool(*)(int,int)> sixth (fn_pt);  // function pointer as Compare  
    27.   
    28.   return 0;  
    29. }  


    2)        大小、判断空函数

        int size() const:返回容器元素个数
        bool empty() const:判断容器是否为空,若返回true,表明容器已空


    3)        增加、删除函数

          pair<iterator,bool> insert( x):插入元素x

        iterator insert(iterator it,x):在迭代器it处插入元素x

        void insert(const value_type *first,const value_type *last):插入[first, last)之间元素

        iterator erase(iterator it):删除迭代器指针it处元素

        iterator erase(iterator first,iterator last):删除[first, last)之间元素

        size_type erase(const Key& key):删除元素值等于key的元素

    1. #include <iostream>  
    2. #include <set>  
    3.   
    4. int main ()  
    5. {  
    6.   std::set<int> myset;  
    7.   std::set<int>::iterator it;  
    8.   std::pair<std::set<int>::iterator,bool> ret;  
    9.   
    10.   // set some initial values:  
    11.   for (int i=1; i<=5; ++i) myset.insert(i*10);    // set: 10 20 30 40 50  
    12.   
    13.   ret = myset.insert(20);               // no new element inserted  
    14.   
    15.   if (ret.second==false) it=ret.first;  // "it" now points to element 20  
    16.   
    17.   myset.insert (it,25);                 // max efficiency inserting  
    18.   myset.insert (it,24);                 // max efficiency inserting  
    19.   myset.insert (it,26);                 // no max efficiency inserting  
    20.   
    21.   int myints[]= {5,10,15};              // 10 already in set, not inserted  
    22.   myset.insert (myints,myints+3);  
    23.   
    24.   std::cout << "myset contains:";  
    25.   for (it=myset.begin(); it!=myset.end(); ++it)  
    26.     std::cout << ' ' << *it;  
    27.   std::cout << ' ';  
    28.   
    29.   return 0;  
    30. }  

    1. #include <iostream>  
    2. #include <set>  
    3.   
    4. int main ()  
    5. {  
    6.   std::set<int> myset;  
    7.   std::set<int>::iterator it;  
    8.   
    9.   // insert some values:  
    10.   for (int i=1; i<10; i++) myset.insert(i*10);  // 10 20 30 40 50 60 70 80 90  
    11.   
    12.   it = myset.begin();  
    13.   ++it;                                         // "it" points now to 20  
    14.   
    15.   myset.erase (it);  
    16.   
    17.   myset.erase (40);  
    18.   
    19.   it = myset.find (60);  
    20.   myset.erase (it, myset.end());  
    21.   
    22.   std::cout << "myset contains:";  
    23.   for (it=myset.begin(); it!=myset.end(); ++it)  
    24.     std::cout << ' ' << *it;  
    25.   std::cout << ' ';  
    26.   
    27.   return 0;  
    28. }  


    4)        遍历函数

         iterator begin():返回首元素的迭代器指针

        iterator end():返回尾元素的迭代器指针
        reverse_iterator rbegin():返回尾元素的逆向迭代器指针
        reverse_iterator rend():返回首元素前一个位置的迭代器指针

         

    1. #include <iostream>  
    2. #include <set>  
    3.   
    4. int main ()  
    5. {  
    6.   int myints[] = {75,23,65,42,13};  
    7.   std::set<int> myset (myints,myints+5);  
    8.   
    9.   std::cout << "myset contains:";  
    10.   for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)  
    11.     std::cout << ' ' << *it;  
    12.   
    13.   std::cout << ' ';  
    14.   
    15.   return 0;  
    16. }  

    5)        操作函数

           const_iterator lower_bound(const Key& key):返回容器中大于等于key的迭代器指针

        const_iterator upper_bound(const Key& key):返回容器中大于key的迭代器指针

        int count(const Key& key) const:返回容器中元素等于key的元素的个数
        pair<const_iterator,const_iterator> equal_range(const Key& key) const:返回容器中元素值等于key的迭代指针[first, last)
        const_iterator find(const Key& key) const:查找功能,返回元素值等于key的迭代器指针
        void swap(set& s):交换集合元素
        void swap(multiset& s):交换多集合元素  

    1. #include <iostream>  
    2. #include <set>  
    3.   
    4. int main ()  
    5. {  
    6.   std::set<int> myset;  
    7.   std::set<int>::iterator itlow,itup;  
    8.   
    9.   for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90  
    10.   
    11.   itlow=myset.lower_bound (30);                //       ^  
    12.   itup=myset.upper_bound (60);                 //                   ^  
    13.   
    14.   myset.erase(itlow,itup);                     // 10 20 70 80 90  
    15.   
    16.   std::cout << "myset contains:";  
    17.   for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)  
    18.     std::cout << ' ' << *it;  
    19.   std::cout << ' ';  
    20.   
    21.   return 0;  
    22. }  
    1. #include "stdafx.h"  
    2. #include <iostream>  
    3. #include <set>  
    4.   
    5. using namespace std;  
    6.   
    7. int main ()  
    8. {  
    9.     set<int> myset;  
    10.   
    11.     for (int i=1; i<=5; i++) myset.insert(i*10);   // myset: 10 20 30 40 50  
    12.   
    13.     pair<set<int>::const_iterator,set<int>::const_iterator> ret;  
    14.     ret = myset.equal_range(30);  
    15.   
    16.     cout << "the lower bound points to: " << *ret.first << ' ';  
    17.     cout << "the upper bound points to: " << *ret.second << ' ';  
    18.   
    19.     return 0;  
    20. }  

    1. #include "stdafx.h"  
    2. #include <iostream>  
    3. #include <set>  
    4.   
    5. using namespace std;  
    6.   
    7. int main ()  
    8. {  
    9.     int myints[]={12,75,10,32,20,25};  
    10.     set<int> first (myints,myints+3);     // 10,12,75  
    11.     set<int> second (myints+3,myints+6);  // 20,25,32  
    12.   
    13.     first.swap(second);  
    14.   
    15.     cout << "first contains:";  
    16.     for (set<int>::iterator it=first.begin(); it!=first.end(); ++it)  
    17.         cout << ' ' << *it;  
    18.     cout << ' ';  
    19.   
    20.     cout << "second contains:";  
    21.     for (set<int>::iterator it=second.begin(); it!=second.end(); ++it)  
    22.         cout << ' ' << *it;  
    23.     cout << ' ';  
    24.   
    25.     return 0;  
    26. }  

  • 相关阅读:
    关于32位操作系统和64位操作系统对InstallShield打包的影响
    NEWS: Symantec宣布Wise Package Studio将终止
    InstallShield 2012新功能试用(2) 调用MsiGetProperty等MSI API发生变化
    Basic INFO 在命令行Build InstallShield安装包工程获得压缩安装包
    NEWS InstallShield 2012 Service Pack 1发布
    Basic INFO InstallShield Basic MSI工程中如何在SetupCompleteSuccess界面中启动Readme
    Basic INFO InstallShield的脚本编辑器中如何显示代码行号
    Basic INFO 关于在InstallShield制作的安装包界面中删除InstallShield文字的厂商回复
    Basic INFO InstallShield工程中如何让产品的快捷方式名称始终与产品名保持一致
    Basic INFO: 创建隐藏文件夹
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332703.html
Copyright © 2011-2022 走看看