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()销毁所有元素,释放内存

    // constructing sets
    #include <iostream>
    #include <set>
    
    bool fncomp (int lhs, int rhs) {return lhs<rhs;}
    
    struct classcomp {
      bool operator() (const int& lhs, const int& rhs) const
      {return lhs<rhs;}
    };
    
    int main ()
    {
      std::set<int> first;                           // empty set of ints
    
      int myints[]= {10,20,30,40,50};
      std::set<int> second (myints,myints+5);        // range
    
      std::set<int> third (second);                  // a copy of second
    
      std::set<int> fourth (second.begin(), second.end());  // iterator ctor.
    
      std::set<int,classcomp> fifth;                 // class as Compare
    
      bool(*fn_pt)(int,int) = fncomp;
      std::set<int,bool(*)(int,int)> sixth (fn_pt);  // function pointer as Compare
    
      return 0;
    }



    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的元素

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



    4)        遍历函数

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

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

         

    #include <iostream>
    #include <set>
    
    int main ()
    {
      int myints[] = {75,23,65,42,13};
      std::set<int> myset (myints,myints+5);
    
      std::cout << "myset contains:";
      for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
        std::cout << ' ' << *it;
    
      std::cout << '
    ';
    
      return 0;
    }

    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):交换多集合元素  

    #include <iostream>
    #include <set>
    
    int main ()
    {
      std::set<int> myset;
      std::set<int>::iterator itlow,itup;
    
      for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90
    
      itlow=myset.lower_bound (30);                //       ^
      itup=myset.upper_bound (60);                 //                   ^
    
      myset.erase(itlow,itup);                     // 10 20 70 80 90
    
      std::cout << "myset contains:";
      for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '
    ';
    
      return 0;
    }
    #include "stdafx.h"
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main ()
    {
    	set<int> myset;
    
    	for (int i=1; i<=5; i++) myset.insert(i*10);   // myset: 10 20 30 40 50
    
    	pair<set<int>::const_iterator,set<int>::const_iterator> ret;
    	ret = myset.equal_range(30);
    
    	cout << "the lower bound points to: " << *ret.first << '
    ';
    	cout << "the upper bound points to: " << *ret.second << '
    ';
    
    	return 0;
    }
    #include "stdafx.h"
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main ()
    {
    	int myints[]={12,75,10,32,20,25};
    	set<int> first (myints,myints+3);     // 10,12,75
    	set<int> second (myints+3,myints+6);  // 20,25,32
    
    	first.swap(second);
    
    	cout << "first contains:";
    	for (set<int>::iterator it=first.begin(); it!=first.end(); ++it)
    		cout << ' ' << *it;
    	cout << '
    ';
    
    	cout << "second contains:";
    	for (set<int>::iterator it=second.begin(); it!=second.end(); ++it)
    		cout << ' ' << *it;
    	cout << '
    ';
    
    	return 0;
    }
  • 相关阅读:
    MongoDB查询
    MongoDB增删改查
    redis复制
    HTTP请求方法与状态码
    Solr工作原理
    idea多行同一列同时编辑;多光标处同时编辑方法
    SVN merge 三种方式
    vue中msgbox的使用;如何在msgbox中新增一个输入框组件传值给后台
    切换或重新输入svn用户名密码或通过tortoisesvn查看svn密码
    MyBatis中#{}和${}的区别
  • 原文地址:https://www.cnblogs.com/shmilxu/p/4834610.html
Copyright © 2011-2022 走看看