首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

[STL基础]set会合

2013-01-23 
[STL基础]set集合网上实例#include string#include set #include conio.h#includeiostreamusing n

[STL基础]set集合

   网上实例

#include <string>#include <set> #include <conio.h>#include<iostream>using namespace std;   /*set和multiset的内部结构通常是由平衡二叉树来实现的。当元素放入容器中时,会按照一定的排序法则自动排序,默认是按照less<>排序规则来排序。这种自动排序的特性加速了元素查找的过程,但是也带来了一个问题,不可以直接修改set或multiset容器中的元素值,因为这样就可能违反了元素自动排序的规则。如果你希望修改一个元素的值,必须先删除原有的元素,再插入新的元素。一个集合(set)是一个容器,它其中的所包含的元素的值是唯一的。集合多集的区别是:set支持唯一的键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。*///定义及初始化;没有返回值,或voidvoid test0(){      set<int> f;     int myint[]={23,3,6,0};    set<int>se(myint,myint+4);//初始化[beg,end)    set<int>th(se.begin(),se.end());//初始化[beg,end),与上面雷同    set<int>fo(se);//拷贝构造函数 }//增加删除元素;返回值是void,除erase()的返回值是iterator外void test1(){ //insert:1.直接插入一个数据 2.在iterator位置上插入一个数据 3.插入[beg,end)一段数据      set<int> myset;    set<int>::iterator it;    for (int i=0;i<5;i++)    {        myset.insert(i*10);//0 10 20 30 40    }    std::pair<set<int>::iterator,bool>ret=myset.insert(20);//20已经存在了,所以ret.second为false    if (!ret.second)    {         it=ret.first;        cout<<*ret.first<<endl;//20    }    myset.insert(it,24);    int myint[]={5,10,15};    myset.insert(myint,myint+3);//插入的是[beg,end);10已经存在了,没有插入    for (it=myset.begin();it!=myset.end();it++)    {        cout<<*it<<" ";//0 5 10 15 20 24 30 40    }    cout<<endl;    //erase:1.删除一个数据 2.删除在iterator位置上的数据 3.删除在[beg,end)区间的数据    myset.erase(24);//0 5 10 15 20 30 40    it=myset.begin();//5 10 15 20 30 40    myset.erase(it);    it=myset.find(20);    myset.erase(it,myset.end());//5 10 15     for (it=myset.begin();it!=myset.end();it++)    {        cout<<*it<<" ";//5 10 15    }    myset.clear();//删除所有元素    //set 的属性(通常是那些没有参数的函数):empty(),size()    if (myset.empty())//判断集合是否为空    {        cout<<"\nmyset is empty"<<endl;    }    if (myset.size()==0)//判断集合是否为空    {        cout<<"myset size is 0"<<endl;    }    int myints[]={24,12,18,9};    set<int>first(myints,myints+2),second(myints+1,myints+4);//初始化是:[beg,end)    first.swap(second);     for (it=first.begin();it!=first.end();it++)    {        cout<<*it<<" ";//9 12 18    }    cout<<endl;    for (it=second.begin();it!=second.end();it++)    {        cout<<*it<<" ";//12 24    }    cout<<endl;    }//访问获取元素;返回值是Type Tvoid test2(){       int myint[]={75,23,65,42,13};    set<int> myset(myint,myint+5);    cout<<*myset.find(65)<<endl;//65 //查找元素的位置iterator,若没有此元素,则返回myset.end()(最后一个元素的下一个位置)    cout<<myset.count(65)<<endl;//1 查询元素的个数}//返回迭代器;返回值是iterator,或reverse_iteratorvoid test3(){     int myint[]={75,23,65,42,13};    set<int> myset(myint,myint+5);//初始化:[beg,end)    for (set<int>::iterator it=myset.begin();it!=myset.end();it++)    {        cout<<*it<<" ";//13 23 42 65 75    }    cout<<"\nreverse myset:"<<endl;    for (set<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++)    {        cout<<*it<<" ";//75 65 42 23 13    }    cout<<endl;     } //其他void test4(){      int myint[]={75,23,65,42,13};    set<int> myset(myint,myint+5);//初始化:[beg,end)    set<int>::key_compare com=myset.key_comp();    set<int>::iterator it=myset.begin();    int keyHighest=*myset.rbegin();//不能使用*myset.end()    do     {        cout<<" "<<*it;//13 23 42 65 75    } while (com(*(it++),keyHighest));    cout<<endl;        set<int>::value_compare val=myset.value_comp();    int valHighest=*myset.rbegin();    it=myset.begin();    do     {        cout<<" "<<*it;//13 23 42 65 75    } while (val(*(it++),valHighest));    cout<<endl;       set<int>::iterator itlows,itups;    itlows=myset.lower_bound(42);    itups=myset.upper_bound(42);    cout<<*itlows<<" "<<*itups<<endl;//42 65    std::pair<set<int>::iterator,set<int>::iterator> pa=myset.equal_range(42);    cout<<"the lower bound point to:"<<*pa.first<<endl;//42    cout<<"the upper bound point to:"<<*pa.second<<endl;//65    //equal_range():返回pair(iterator,iterator),pair中的第一个迭代器是lower_bound()返回的迭代器,pair中的第二个迭代器是upper_bound()返回的迭代器,如果两个迭代器相等,则说明map中不存在这个关键字    //lower_bound():返回是iterator,返回要查找关键字的下界(是一个迭代器)    //upper_bound():返回是iterator,返回要查找关键字的上界(是一个迭代器)     } //遍历map中的数据void test5(){      //1.使用前向迭代器    //2.使用相反迭代器     int myint[]={75,23,65,42,13};    set<int> myset(myint,myint+5);//初始化:[beg,end)    for (set<int>::iterator it=myset.begin();it!=myset.end();it++)    {        cout<<*it<<" ";//13 23 42 65 75    }    cout<<"\nreverse myset:"<<endl;    for (set<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++)    {        cout<<*it<<" ";//75 65 42 23 13    }    cout<<endl;     } void Test(char h){    cout<<"press key===="<<h<<endl;    switch(h)    {     case '0':  test0();break;    case '1':  test1();break;    case '2':  test2();break;    case '3':  test3();break;    case '4':  test4();break;    case '5':  test5();break;     case 27:    case 'q':exit(0);break;     default:cout<<"default "<<h<<endl;break;    }}void main(){    while(1)    {        Test(getch());    } }

 

热点排行