/* * ******************************************** * multimap多重映照容器的基础说明: ******************************************** * * multimap多重映照容器:容器的数据结构采用红黑树进行管理 * multimap的所有元素都是pair:第一元素为键值(key),不能修改;第二元素为实值(value),可被修改 * * multimap特性以及用法与map完全相同,唯一的差别在于: * 允许重复键值的元素插入容器(使用了RB-Tree的insert_equal函数) * 因此: * 键值key与元素value的映照关系是多对多的关系 * 没有定义[]操作运算 * * Sorted Associative Container Pair Associative Container Unique Associative Container * * 使用multimap必须使用宏语句#include <map> * ************************************************************************************** * * 创建multimap对象: * 1.multimap<char,int,greater<char> > a; //元素键值类型为char,映照数据类型为int,键值的比较函数对象为greater<char> * 2.multimap(const key_compare& comp) //指定一个比较函数对象comp来创建map对象 * 3.multimap(const multisetr&); //multimap<int,char*> b(a); //此时使用默认的键值比较函数less<int> * 4.multimap(first,last); * 5.multimap(first,last,const key_compare& comp); * * //Example: * pair<const int ,char> p1(1,'a'); * pair<const int ,char> p2(2,'b'); * pair<const int ,char> p3(3,'c'); * pair<const int ,char> p4(4,'d'); * pair<const int ,char> pairArray[]={p1,p2,p3,p4}; * multimap<const int,char> m4(pairArray,pairArray+5); * multimap<const int,char> m3(m4); * multimap<const int,char,greater<const int> > m5(pairArray,pairArray+5,greater<const int>()); * ************************************************************************************** * * 元素的插入 * //typedef pair<const key,T> value_type; * pair<iterator,bool> insert(const value_type& v); * 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(); * * iterator lower_bound();iterator upper_bound();pair<iterator,iterator> equal_range();//上界、下届、确定区间 * * * ******************************************** ** cumirror ** tongjinooo@163.com ** ** ******************************************** * */ #include <map> #include <string> #include <iostream> // 基本操作与set类型,牢记map中所有元素都是pair // 对于自定义类,初学者会觉得比较函数如何构造很麻烦,这个可以参照前面的书写示例 // 但若设置键值为int或char类型,无须构造比较函数 struct student{ char* name; int age; char* city; char* phone; }; int main() { using namespace std; student s[]={ {"童进",23,"武汉","XXX"}, {"老大",23,"武汉","XXX"}, {"饺子",23,"武汉","XXX"}, {"王老虎",23,"武汉","XXX"}, {"周润发",23,"武汉","XXX"}, {"周星星",23,"武汉","XXX"} }; pair<int,student> p1(4,s[0]); pair<int,student> p2(2,s[1]); pair<int,student> p3(3,s[2]); pair<int,student> p4(4,s[3]); //键值key与p1相同 pair<int,student> p5(5,s[4]); pair<int,student> p6(6,s[5]); multimap<int,student> a; a.insert(p1); a.insert(p2); a.insert(p3); a.insert(p4); a.insert(p5); a.insert(p6); typedef multimap<int,student>::iterator int_multimap; pair<int_multimap,int_multimap> p = a.equal_range(4); int_multimap i = a.find(4); cout<<"班上key值为"<< i->first<<"的学生有:"<<a.count(4)<<"名,"<<" 他们是:"<<endl; for(int_multimap k = p.first; k != p.second; k++) { cout<<k->second.name<<endl; } cout<<"删除重复键值的同学"<<endl; a.erase(i); cout<<"现在班上总人数为:"<<a.size()<<". 人员如下:"<<endl; for(multimap<int,student>::iterator j=a.begin(); j != a.end(); j++) { cout<<"The name: "<<j->second.name<<" "<<"age: "<<j->second.age<<" " <<"city: "<<j->second.city<<" "<<"phone: "<<j->second.phone<<endl; } return 0; }
微信
支付宝