/*
*
********************************************
* 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;
}