zoukankan      html  css  js  c++  java
  • [STL]set/multiset用法详解[自从VS2010开始,set的iterator类型自动就是const的引用类型]

    集合

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

    [cpp] view plain copy
     
    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的元素

    [cpp] view plain copy
     
    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. }  
    [cpp] view plain copy
     
    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():返回首元素前一个位置的迭代器指针

         

    [cpp] view plain copy
     
    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):交换多集合元素  

    [cpp] view plain copy
     
    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. }  
    [cpp] view plain copy
     
    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. }  
    [cpp] view plain copy
     
      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. 自从VS2010开始,set的iterator类型自动就是const的引用类型,因此当set保存的是类类型时,对iterator解引用无法调用类的非const成员。

        解决方法为:

        [cpp] view plain copy
         
        1. //item是一个类,bool isEnd()是Item的一个成员  
        2. for (set<Item>::iterator i = ItemSet.begin(); i != ItemSet.end(); i++)  
        3.         {  
        4.             const Item &item1 = const_cast<Item&>(*i);  
        5.             Item  &item2 = const_cast<Item&>(item1);  
        6.             if (item2.isEnd())            
        7.             {//do something}  
        const_cast:(转自百度百科)
        用法:const_cast<type_id> (expression)
        该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
        一、常量指针被转化成非常量的指针,并且仍然指向原来的对象;
        二、常量引用被转换成非常量的引用,并且仍然指向原来的对象;

        为什么要设置为const reference?

        转自:http://stackoverflow.com/questions/2523139/const-references-when-dereferencing-iterator-on-set-starting-from-visual-studio

        The iterator should give you a const reference (and that's what the Standard says it should do), because changing the thing referred to would destroy the validity of the set's underlying data structure - the set doesn't "know" that the field you are changing is not actually part of the key. The alternatives are to make changes by removing and re-adding, or to use a std::map instead.

        因为改变引用指向的对象会破坏set隐藏的数据结构的正确性。

  • 相关阅读:
    [转]Ubuntu Tweak 0.8.7 发布:支持 Ubuntu 14.04
    冷知识 —— 地名的解释
    冷知识 —— 地名的解释
    冷知识 —— 国家域名、国际电话区号列表
    冷知识 —— 国家域名、国际电话区号列表
    基于梯度的权重更新优化迭代算法
    基于梯度的权重更新优化迭代算法
    中英文对照 —— 图表等的可视化
    中英文对照 —— 图表等的可视化
    matplotlib plot 绘图函数发生阻塞(block)时的解决方法
  • 原文地址:https://www.cnblogs.com/lyggqm/p/5523284.html
Copyright © 2011-2022 走看看