您的位置:首页 > 编程语言 > C语言/C++

C++ STL学习笔记十 multimap多重映照容器

2015-10-12 20:17 405 查看
/*

*

********************************************

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: