细数C++ STL 的那些事---set(元素唯一,且排序)

来源:互联网 发布:java web论坛 编辑:程序博客网 时间:2024/06/06 09:18

1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据。它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序。每个元素的值不能直接被改变。

        【重点】内部结构采用红黑树的平衡二叉树

              multiset 跟set 类似,唯一的区别是允许键值重复!!!

        2)使用

                    需加载的头文件:   #include<set>
                                          using namespace std;

                     template<

                                     class  Key,            //存储在容器中的关键字类型

                                     class  Compare=less<Key>, //比较两个元素的函数来决定在Set中位置(可选)

                                     class  Allocator=allocator<Key>  //代表存储管理设备(可选)

                                     >

        3)特点

                  1>关联容器,大小可以改变,根据关键字值来提高读取数据的能力。

                  2>提供一个双向定位器来读写数据。

                  3>根据关键字和一个比较函数来排好序

                  4>关键字唯一


         4)资源

                         STL 中Set详细介绍


         5)函数

              1>begin() 返回指向第一个元素的迭代器
              2>clear() 清除所有元素
              3>count() 返回某个值元素的个数

              4>empty() 如果集合为空,返回true
              5>end() 返回指向最后一个元素的迭代器


              6>equal_range() 返回第一个>=关键字的迭代器和>关键字的迭代器
              语法:
                   pair <iterator,iterator>equal_range( const key_type &key );//key是用于排序的关键字
                   Set<int> ctr;
              例如:
                   Pair<set<int>::iterator,set<int>::iterarot>p;
                   For(i=0;i<=5;i++) ctr.insert(i);
                   P=ctr.equal_range(2);
                   那么*p.first==2;*p.second==3;


             7>erase() 删除集合中的元素
             语法:
                  iterator erase( iterator i ); //删除i位置元素,返回第一个不被删除的双向定位器,不存在返回末尾
                  iterator erase( iterator start, iterator end );//删除从start开始到end(end为第一个不被删除的值)结束的元素
                  size_type erase( const key_type &key );//删除等于key值的所有元素(返回被删除的元素的个数)


            8>find() 返回一个指向被查找到元素的迭代器
               语法:
                   iterator find( const key_type &key );//查找等于key值的元素,并返回指向该元素的迭代器;如果没有找到,返回指向集合最后一个元素的迭代器
             9>get_allocator() 返回集合的分配器
            10>insert() 在集合中插入元素
               语法:
                   iterator insert( iterator i, const TYPE &val ); //在迭代器i前插入val
                   void insert( input_iterator start, input_iterator end );//将迭代器start开始到end(end不被插入)结束返回内的元素插入到集合中
                   pair insert( const TYPE &val );//插入val元素,返回指向该元素的迭代器和一个布尔值来,注意不能插入两个相同的元素


            11>lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
              语法:
                   iterator lower_bound( const key_type &key );//返回一个指向大于或者等于key值的第一个元素的迭代器


            12>key_comp() 返回一个用于元素间值比较的函数
             语法:
                   key_compare key_comp();//返回一个用于元素间值比较的函数对象

            13>max_size() 返回集合能容纳的元素的最大限值

            14>rbegin() 返回指向集合中最后一个元素的反向迭代器
             示例:
                  Set<int> ctr;
                  Set<int>::reverse_iterator rcp;
                  For(rcp=ctr.rbegin();rcp!=ctr.rend();rcp++)
                  Cout<<*rcp<<” ”;


            15>rend() 返回指向集合中第一个元素的反向迭代器
            16>size() 集合中元素的数目
            17>swap() 交换两个集合变量
              语法:
                   void swap( set &object ); //交换当前集合和object集合中的元素
            18>upper_bound() 返回大于某个值元素的迭代器
              语法:
                   iterator upwer_bound( const key_type &key );//返回一个指向大于key值的第一个元素的迭代器
            19>value_comp() 返回一个用于比较元素间的值的函数
              语法:
                   iterator upper_bound( const key_type &key );//返回一个用于比较元素间的值的函数对象

            6)示例

[html] view plaincopy
  1. #include <iostream>  
  2. #include <set>  
  3. #include <algorithm>  
  4. using namespace std;  
  5.   
  6. int main(int argc, char** argv) {  
  7.   
  8.     int i;  
  9.     int ia[5]={1,2,3,4,5};  
  10.     set<int> iset(ia,ia+5);  
  11.       
  12.     cout<<"size="<<iset.size()<<"; count of 3 ="<<iset.count(3)<<endl;  
  13.     iset.insert(3); //不会插入重复的值  
  14.     cout<<"size="<<iset.size()<<"; after insert 3 count of 3 ="<<iset.count(3)<<endl;  
  15.       
  16.     iset.insert(6);  
  17.     cout<<"after insert 6 size="<<iset.size()<<endl;  
  18.       
  19.     iset.erase(1);  
  20.     cout<<"after erase 1 size="<<iset.size()<<"count of 1 ="<<iset.count(1)<<endl;  
  21.       
  22.     set<int>::iterator ite1=iset.begin();  
  23.     set<int>::iterator ite2=iset.end();  
  24.     for(;ite1!=ite2;ite1++)  
  25.         cout<<*ite1<<" ";  
  26.     cout<<endl;  
  27.       
  28.     //使用STL的find来搜寻元素  
  29.       
  30.     ite1=find(iset.begin(),iset.end(),2);  
  31.     if(ite1!=iset.end())  
  32.         cout<<"2 found"<<endl;  
  33.     else  
  34.         cout<<"2 not found"<<endl;  
  35.       
  36.     //使用set 提供的find函数  
  37.     ite1=iset.find(8);  
  38.     if(ite1!=iset.end())  
  39.         cout<<"8 found"<<endl;  
  40.     else  
  41.         cout<<"8 not found"<<endl;  
  42.               
  43.       
  44.       
  45.       
  46.       
  47.     return 0;  
  48. }  

size=5; count of 3 =1
size=5; after insert 3 count of 3 =1
after insert 6 size=6
after erase 1 size=5count of 1 =0
2 3 4 5 6 
2 found
8 not found
原创粉丝点击