C++ STL學習筆記八 multiset多重集合容器

來源:互聯網
上載者:User

/*
 *
 ********************************************
 *   multiset多重集合容器的基礎說明:
 ********************************************
 *
 * multiset多重集合容器使用RB-Tree的平衡二叉檢索樹的資料結構。
 * 允許將重複索引值的元素插入到multiset中
 * 插入過程中要進行平衡處理,但檢索過程效率高
 *
 * 提供了元素插入、刪除、檢索的功能
 * Sorted Associative Container  Simple Associative Container   Multiple Associative Container
 *
 * 使用multisetr必須使用宏語句#include <set>   //與set相同
 *
 **************************************************************************************
 *
 * 建立multisetr對象:
 * template < class Key, class Compare=less<Key>, class Alloc=alloc >
 *
 * 1.multisetr<int> a;
 * 2.multisetr(const key_compare& comp)    //指定一個比較函數對象comp來建立set對象,詳細使用見main()中樣本
 *  3.multisetr(const multisetr&);      //multisetr<int> b(a);
 * 4.multisetr(first,last);       //multisetr<char> c(a.begin(),a.end())
 * 5.multisetr(first,last,const key_compare& comp); //依據comp函數進行插入排序
 **************************************************************************************
 *
 * 元素的插入
 * iterator insert(const value_type& v);    //不再是返回pair,而是插入的迭代器位置
 * iterator insert(iterator pos,const value_type& v);
 * void insert(first,last);
 *
 **************************************************************************************
 *
 * 元素的刪除
 * void erase(iterator pos);
 * size_type erase(const key_type& k);     //刪除等於索引值k的元素
 * void erase(first,last);        //刪除[first,last)區間的元素
 * void clear();
 *
 **************************************************************************************
 *
 * 訪問與搜尋
 *
 * iterator begin();iterator end();     //企圖通過迭代器改變元素是不被允許的
 * reverse_iterator rbegin();reverse_iterator rend();
 *
 * iterator find(const key_type& k) const;
 * pair<iterator,iterator> equal_range(const key_type& k) const;//返回的pair對象,
 *                //first為lower_bound(k);大於等於k的第一個元素位置
 *                //second為upper_bound();大於k的第一個元素位置
 *
 * 其它常用函數
 * bool empty() const;
 * size_type size() const;
 * size_type count(const key_type& k) const;   //返回索引值等於k的元素個數
 * void swap();
 *
 * //main中包含了一下函數的簡單例子
 * iterator lower_bound();iterator upper_bound();pair<iterator,iterator> equal_range();//上界、下屆、確定區間
 *
 *
 *
 ********************************************
 **   cumirror ** tongjinooo@163.com **    **
 ********************************************
 *
 */

#include <set>
#include <iostream>

// 自訂資料的插入
struct student{
 char name[20];
 int age;
 char city[20];
 char phone[20];
};

// 這裡採用函數對象的方式設定,與set中有不同,key設定為city,注意應設定為public
class stuCmp{
public:
 bool operator()(const student& a,const student& b) const{
  return strcmp(a.city,b.city)<0;
 }
};

// 對於一些基礎資料型別 (Elementary Data Type),如int,string等可參照set
int main(){
 using namespace std;
 student stu1={"童進",23,"長沙","XXX"};
 student stu2={"老大",28,"武漢","XXX"};    //老大,你成熟了5歲,哈哈
 student stu3={"餃子",23,"福州","XXX"};
// multiset<student,stuCmp> b;       
 multiset<student,stuCmp> b(stuCmp());
 b.insert(stu1);
 b.insert(stu2);
 b.insert(stu3);
// 武漢同學最多,只是現在大家又都天各一方
 student stu4={"小芳",23,"武漢","XXX"};
 student stu5={"黃慶",23,"武漢","XXX"};
 student stu6={"英俊",23,"武漢","XXX"};
 b.insert(stu4);
 b.insert(stu5);
 b.insert(stu6);

 for(multiset<student,stuCmp>::iterator i=b.begin();i!=b.end();i++){
  cout<<i->name<<endl;
 }

 student key={"",99,"武漢","XXX"};
 cout<<"武漢朋友數目:"<<b.count(key)<<endl;
 cout<<"武漢的第一個朋友:"<<b.lower_bound(key)->name<<endl;
 cout<<"武漢最後一個朋友:"<<(--b.upper_bound(key))->name<<endl; // 這裡武漢是最後的,再大於這個索引值,就會返回end()指向前端節點,所以--
 for(multiset<student,stuCmp>::reverse_iterator j=b.rbegin();j!=b.rend();j++){
  cout<<j->name<<endl;
 }

// 驗證set中的猜測,此時索引值為city
 student test={"路人甲",99,"武漢","XXX"};    
 multiset<student,stuCmp>::iterator v=b.find(test); //返回第一個與索引值相等的迭代器  
 cout<<"尋找武漢的路人甲:"<<v->name<<endl;

// 元素搜尋
 cout<<"搜尋武漢的朋友們:"<<endl;
 pair<multiset<student,stuCmp>::iterator,multiset<student,stuCmp>::iterator> p=b.equal_range(test);
 for(multiset<student,stuCmp>::iterator k=p.first;k!=p.second;k++){
  cout<<k->name<<endl;
 }
 return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.