程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [STL基礎]multiset多重集合

[STL基礎]multiset多重集合

編輯:C++入門知識

網上實例  [cpp]  #include <string>   #include <set>    #include <conio.h>   #include<iostream>   using namespace std;      //multiset多重集合與set集合的區別:multiset可以擁有多個相同的元素,而set中的元素是唯一的。由此,其函數的不同:erase()參數是元素時,會刪除其全部相同的數據。其他的函數與用法與set完全一致。   /*  set和multiset的內部結構通常是由平衡二叉樹來實現的。當元素放入容器中時,會按照一定的排序法則自動排序,默認是按照less<>排序規則來排序。這種自動排序的特性加速了元素查找的過程,但是也帶來了一個問題,不可以直接修改set或multiset容器中的元素值,因為這樣就可能違反了元素自動排序的規則。如果你希望修改一個元素的值,必須先刪除原有的元素,再插入新的元素。  一個集合(set)是一個容器,它其中的所包含的元素的值是唯一的。集合多集的區別是:set支持唯一的鍵值,set中的值都是特定的,而且只出現一次;而multiset中可以出現副本鍵,同一值可以出現多次。  */   //定義及初始化;沒有返回值,或void   void test0()   {         multiset<int> f;        int myint[]={23,3,6,6,0};       multiset<int>se(myint,myint+5);//初始化[beg,end)       multiset<int>th(se.begin(),se.end());//初始化[beg,end),與上面雷同       multiset<int>fo(se);//拷貝構造函數    }   //增加刪除元素;返回值是void,除erase()的返回值是iterator外   void test1()   {   //insert:1.直接插入一個數據 2.在iterator位置上插入一個數據 3.插入[beg,end)一段數據         multiset<int> myset;       multiset<int>::iterator it=myset.begin();       myset.insert(20);       for (int i=0;i<5;i++)       {           myset.insert(i*10);//0 10 20 20 30 40       }        myset.insert(it,24);       int myint[]={5,10,15};       myset.insert(myint,myint+3);//插入的是[beg,end);       for (it=myset.begin();it!=myset.end();it++)       {           cout<<*it<<" ";//0 5 10 10 15 20 20 24 30 40       }       cout<<endl;       //erase:1.刪除一個數據 2.刪除在iterator位置上的數據 3.刪除在[beg,end)區間的數據       myset.erase(20);//0 5 10 10 15 24 30 40//刪除所有值是20的元素       it=myset.find(10);       myset.erase(it);//0 5 10 15 24 30 40//只刪除一個元素       it=myset.find(24);       myset.erase(it,myset.end());//0 5 10 15        for (it=myset.begin();it!=myset.end();it++)       {           cout<<*it<<" ";//0 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,12,18,9};       multiset<int>first(myints,myints+2),second(myints+1,myints+5);//初始化是:[beg,end)       first.swap(second);        for (it=first.begin();it!=first.end();it++)       {           cout<<*it<<" ";//9 12 12 18       }       cout<<endl;       for (it=second.begin();it!=second.end();it++)       {           cout<<*it<<" ";//12 24       }       cout<<endl;       }   //訪問獲取元素;返回值是Type T   void test2()   {          int myint[]={75,23,65,65,42,13};       multiset<int> myset(myint,myint+5);       cout<<*myset.find(65)<<endl;//65 //查找元素的位置iterator,若沒有此元素,則返回myset.end()(最後一個元素的下一個位置)       cout<<myset.count(65)<<endl;//2 查詢元素的個數   }   //返回迭代器;返回值是iterator,或reverse_iterator   void test3()   {        int myint[]={75,23,65,65,42,13};       multiset<int> myset(myint,myint+5);//初始化:[beg,end)       for (multiset<int>::iterator it=myset.begin();it!=myset.end();it++)       {           cout<<*it<<" ";//13 23 42 65 65 75       }       cout<<"\nreverse myset:"<<endl;       for (multiset<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++)       {           cout<<*it<<" ";//75 65 65 42 23 13       }       cout<<endl;        }    //其他   void test4()   {         int myint[]={75,23,65,65,42,13};       multiset<int> myset(myint,myint+6);//初始化:[beg,end)       multiset<int>::key_compare com=myset.key_comp();       multiset<int>::iterator it=myset.begin();       int keyHighest=*myset.rbegin();//不能使用*myset.end()       do        {           cout<<" "<<*it;//13 23 42 65 65 75       } while (com(*(it++),keyHighest));       cout<<endl;          multiset<int>::value_compare val=myset.value_comp();       int valHighest=*myset.rbegin();       it=myset.begin();       do        {           cout<<" "<<*it;//13 23 42 65 65 75       } while (val(*(it++),valHighest));       cout<<endl;          multiset<int>::iterator itlows,itups;       itlows=myset.lower_bound(65);       itups=myset.upper_bound(65);       cout<<*itlows<<" "<<*itups<<endl;//65 75       std::pair<multiset<int>::iterator,multiset<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中不存在這個關鍵字;就是在一個有序的數組中,取某個值Q[k]的前一個值Q[k-1]或是他本是Q[k]和後一個值Q[k+1]       //lower_bound():返回是iterator,返回要查找關鍵字的下界(是一個迭代器),指向鍵值<=key的第一個元素       //upper_bound():返回是iterator,返回要查找關鍵字的上界(是一個迭代器),指向鍵值>key的第一個元素   }    //遍歷map中的數據   void test5()   {         //1.使用前向迭代器       //2.使用相反迭代器        int myint[]={75,23,65,65,42,13};       multiset<int> myset(myint,myint+6);//初始化:[beg,end)       for (multiset<int>::iterator it=myset.begin();it!=myset.end();it++)       {           cout<<*it<<" ";//13 23 42 65  65 75       }       cout<<"\nreverse myset:"<<endl;       for (multiset<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++)       {           cout<<*it<<" ";//75 65 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());       }    }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved