multimap应用

/*一直不大了解multimap的应用原理,做了个简陋的电话薄尝试了一下。
总的来说,multimap的成员是单独的pair类型,与map不同的是,multimap不支持下标运算,因为其一个键可以对应多个实例(值)。
因此,处理这些实例就多了许多的麻烦。然而,关联容器的内容在内存中不是连续储存的,只有相同键的多个实例会被放在一起,当从begin()向end()输出的时候,系统会自动进行字典排序处理。这时,想找到相同的键对应的值就简单了很多。有一个很重要的函数m.equal_range( k ) 返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k) , second成员则等价于m.upper_bound( k )。这时就可以通过迭代器很容易的进行迭代器++以及erase( )或读取功能了。
同时,应该注意的一点是,带有一个键参数的erase版本将删除拥有该键的所有元素,并返回删除个数。而带有一个或一对迭代器参数的版本只删除特定的元素,并返回void 。因此,删除数据时使用迭代器未免不是一个好的选择。
以下是源码:*/
-------------/*Book.cpp*/----------------
#include "stdafx.h"
#include"Book.h"
void Phone_book::put(multimap<string,long long> &book)
{
	for(multimap<string,long long>::iterator putter=book.begin();putter!=book.end();putter++)
		cout<<putter->first<<setw(15)<<putter->second<<endl;
}
void Phone_book::add(multimap<string,long long> &book)
{
	system("cls");
	cout<<"Put name and phone number(one name can connect more number):";
	put(book);
	string name;
	long long number;
	while(cin>>name>>number)
	{
		if(name=="0")
			break;
		book.insert(make_pair(name,number));
	}
	multimap<string,long long>::iterator sel;                          
	for(sel=book.begin();sel!=book.end();sel++)
	{
		cout<<sel->first<<setw(15)<<sel->second<<endl;
	}

}
void Phone_book::select(multimap<string,long long> &book)
{
	typedef multimap<string,long long>::iterator iter;
	system("cls");
	cout<<"Who do you want to select"<<endl;
	string sel_name;
	cin>>sel_name;
	pair<iter,iter> pos=book.equal_range(sel_name);
	for(iter sel=pos.first;sel!=pos.second;sel++)
	{
		cout<<sel->first<<setw(15)<<sel->second<<endl;
	}

}
void Phone_book::erase(multimap<string,long long> &book)
{
	typedef multimap<string,long long>::iterator iter;
	system("cls");
	cout<<"Who do you want to erase"<<endl;
	put(book);
	string era_name;
	cin>>era_name;
	pair<iter,iter> pos=book.equal_range(era_name);
	cout<<era_name<<endl;
	int item=1;
	for(iter era=pos.first;era!=pos.second;era++,item++)
	{
		cout<<'['<<item<<']'<<"    "<<era->second<<endl;
	}
	int option;
	cin>>option;
	iter era=pos.first;
	while(--option)
		era++;
	book.erase(era);
}
--------/*Book.h*/---------
#ifndef BOOK_H
#define BOOK_H
#include<iostream>
#include<map>
#include<string>
#include<iomanip>
#include<utility>
using namespace std;

class Phone_book
{
public:
	void add(multimap<string,long long> &);
	void select(multimap<string,long long> &);
	void erase(multimap<string,long long> &);
	void put(multimap<string,long long> &);
};

#endif
------------/*main.cpp*/------------
#include "stdafx.h"
#include<conio.h>
#include"Book.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	multimap<string,long long> Pb;
	cout<<"Welcome to your Phone Book"<<endl<<endl;
	while(1)
	{
		cout<<"[1] select		[2] add		[3] erase"<<endl;
		Phone_book new_book;
		int option;
		option=_getch()-48;
		switch(option)
		{
		case 1:new_book.select(Pb);break;
		case 2:new_book.add(Pb);break;
		case 3:new_book.erase(Pb);break;
		}
	}
	return 0;
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值