C++ STL (1)set容器用法、操作详细介绍

来源:互联网 发布:软件标识号 编辑:程序博客网 时间:2024/06/03 15:19

1.前言
    set容器是C++ STL中的容器之一,set容器有以下几个显著的特点:(1)set中的元素的值是唯一的;(2)set的元素是按照特定的顺序进行排列的,默认情况下是按照升序进行排列的;(3)set中的元素不能够被修改,可以通过删除操作将元素删除;C++ stl中的关联容器:map,set,multiset,multimap内部的数据结构为红黑树(RB树)。
2.set的操作

(1)set的所有操作


(2)选取常用的函数进行分析

#include <iostream>#include <set>#include <utility>#include <iomanip>using namespace std;bool fcomp(int x1,int x2){return x1<x2;}struct classcomp {bool operator()(const int &lhs,const int& rhs) const{return lhs>rhs;}};//f_construct()函数着重介绍set的构造函数void f_construct(){//默认构造函数  explicit set (const key_compare& comp = key_compare(),//                           const allocator_type& alloc = allocator_type());set<int> first; int myints[]={20,10,30,40,50};//范围 set (InputIterator first, InputIterator last,    //          const key_compare& comp = key_compare(),//          const allocator_type& = allocator_type());                                       set<int> second(myints,myints+5);     //赋值  set (const set& x);                                  set<int> third(second);              set<int> fourth(second.begin(),second.end()); //迭代器的范围set<int,classcomp> fifth(second.begin(),second.end());  //迭代器的范围cout<<"second(set 中默认升序排列):";for (set<int>::iterator iter=second.begin();iter!=second.end();iter++){cout<<*iter<<' ';}cout<<endl;cout<<"fifth(通过自定义set的比较函数,来明确set中集合的顺序):";for (set<int,classcomp>::iterator iter=fifth.begin();iter!=fifth.end();iter++){cout<<*iter<<' ';}cout<<endl;bool(*f_pt)(int,int)=fcomp;set<int,bool(*)(int,int)> sixth(f_pt);sixth.insert(myints,myints+5);cout<<"sixth :";for (set<int,bool(*)(int,int)>::iterator iter=sixth.begin();iter!=sixth.end();iter++){cout<<*iter<<' ';}cout<<endl;}//f_insert()函数着重介绍set的insert操作;void f_insert(){set<int> myset;typedef set<int>::iterator iterType;iterType iter1;pair<set<int>::iterator ,bool> ret;//initializer list (1)直接插入单个元素用来初始化set//void insert (initializer_list<value_type> il);for (int i=1;i<=10;i++)   //初始化set中的elements{myset.insert(i);}//single element(2)//pair<iterator,bool> insert (const value_type& val);//pair<iterator,bool> insert (value_type&& val);ret=myset.insert(5);    // 未插入新元素   if (ret.second==false){iter1=ret.first;   }                        //iter1当前指向元素5 //with hint (3)通过固定的指针位置插入元素//iterator insert (const_iterator position, const value_type& val);//iterator insert (const_iterator position, value_type&& val);myset.insert(myset.begin(),11); myset.insert(myset.end(),12);  int a[]={13,14,15,10,9}; //插入myset中的元素实际为13,14,15//range (4)通过指针的范围插入新元素//template <class InputIterator>//void insert (InputIterator first, InputIterator last);myset.insert(a,a+5);cout<<"myset :";for (iterType iter=myset.begin();iter!=myset.end();iter++){cout<<*iter<<' ';}cout<<endl;}//f_size_empty_max_size()函数着重介绍set的size、empty 、max_size函数;void f_size_empty_max_size(){int a[]={1,2,4,5};set<int>  first(a,a+4);//bool empty() const noexcept //判断set是否为空cout << "myset contains:";while (!first.empty()){std::cout << ' ' << *first.begin();first.erase(first.begin());}cout<<endl;//size_type size() const noexcept;//求set中元素的个数cout<<"first 中元素的个数:"<<first.size()<<endl;//size_type max_size() const noexcept;//max_size返回set中最多能够容纳的元素的个数cout<<"first 中最多能够容纳元素的个数:"<<first.max_size()<<endl;}// f_iteratorOperations()函数着重介绍set中的迭代器操作,包括:begin(),end(),rbegin(),rend();void f_iteratorOperations(){int myints[] = {75,23,65,42,13};std::set<int> firstSet (myints,myints+5);//通过begin和end返回指向set集合中的第一个元素的迭代器,和返回最后一个元素的下一个元素的迭代器。 std::cout << "顺序遍历set集合中的每一个元素,结果如下:"<<endl;for (set<int>::iterator iter=firstSet.begin();iter!=firstSet.end();iter++){cout<<*iter<<' ';}cout<<endl;//通过rbegin和rend返回指向set集合中的最后一个元素的迭代器,和返回第一个元素之前的元素的迭代器std::cout << "反序遍历set集合中的每一个元素,结果如下:"<<endl;for (set<int>::reverse_iterator iter=firstSet.rbegin();iter!=firstSet.rend();iter++){cout<<*iter<<' ';}cout<<endl;}//f_find_count()函数着重介绍set的find和count操作;void f_find_count(){int myints[] = {75,23,65,42,13};std::set<int> firstSet (myints,myints+5);//iterator find (const value_type& val) const;//find()函数如果找到了val元素则返回指向val的迭代器,否则返回set::end;set<int>::iterator iterVal23=firstSet.find(23);//iterVal是指向23的迭代器set<int>::iterator iterVal99=firstSet.find(99);//set集合中没有99这个元素,所以iterVal99为firstSet.end();firstSet.erase(iterVal23);//从firstSet中删除iterVal23所指向的元素std::cout << "firstSet contains:";for (set<int>::iterator it=firstSet.begin(); it!=firstSet.end(); ++it)std::cout << ' ' << *it;cout<<endl;//size_type count (const value_type& val) const;//count()函数返回set中值为val的元素的个数set<int>::size_type num22=firstSet.count(22);cout<<"firstSet中值为22的元素的数目:"<<num22<<endl;}//f_keyCpmpare_valueCompare()函数着重介绍set的key_comp()函数和value_comp()函数;void f_keyCpmpare_valueCompare(){int myints[] = {75,23,65,42,13};std::set<int> myset(myints,myints+5);int highest;//key_compare key_comp() const;set<int>::key_compare mycomp = myset.key_comp();//key_compare key_comp() const;set<int>::value_compare  mycomp1= myset.key_comp();std::cout << "myset contains:";highest=*myset.rbegin();std::set<int>::iterator it=myset.begin();do {std::cout << ' ' << *it;} while ( mycomp(*(++it),highest) );std::cout << '\n';}//f_erease()函数着重介绍set的erease操作()void f_erease(){int myints[] = {75,23,65,42,13};std::set<int> myset(myints,myints+5);cout<<"顺序遍历myset中元素的结果:"<<endl;for (set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;cout<<endl;//(1)size_type erase (const value_type& val);//删除值为val的元素myset.erase(75);//(2)  void erase (iterator position);//删除迭代器position所指向的元素myset.erase(myset.begin());//void erase (iterator first, iterator last);//删除first,last迭代器之间的元素myset.erase(myset.begin(),myset.begin()); // 未删除任何元素cout<<"删除部分元素之后set中的元素:"<<endl;for (set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;cout<<endl;}int main(){cout<<setfill('*')<<setw(50)<<"f_construct():"<<endl;f_construct();cout<<setfill('*')<<setw(50)<<"f_erease():"<<endl;f_erease();    cout<<setfill('*')<<setw(50)<<"f_find_count():"<<endl;f_find_count();cout<<setfill('*')<<setw(50)<<"f_insert():"<<endl;f_insert();cout<<setfill('*')<<setw(50)<<"f_iteratorOperations():"<<endl;f_iteratorOperations();cout<<setfill('*')<<setw(50)<<"f_keyCpmpare_valueCompare():"<<endl;f_keyCpmpare_valueCompare();cout<<setfill('*')<<setw(50)<<"f_size_empty_max_size():"<<endl;f_size_empty_max_size();}




1 0
原创粉丝点击