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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐