当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 使用 <map> 库创建关联容器

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 使用 <map> 库创建关联容器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 47 ::
收藏到网摘: n/a

使用 <map> 库创建关联容器

作者:Danny Kalev
编译:MTT 工作室

下载源代码

原文出处:Use the <map> Library to Create Associative Containers

摘要:当索引是整型,那么将值与之关联并不难,但如果数据的关联值对是其它数据类型怎么办呢?<map>库具备一个关联容器,使用它可以很方便地关联所有类型的数据对。本文将讨论 <map> 库的使用方法和技巧。



  关系数据库,科学计算应用以及基于Web的系统常常需要类似 vector 的容器,其索引可以是如何数据类型,不一定是整数。这样的容器叫关联容器,或者 map。例如,目录服务应用可以将私人姓名作为索引来存储,电话号码作为其关联的值:
directory["Harry"]=8225687;// 插入 "Harry" 并与他的电话号码关联iterator it=directory.find("Harry");// 获取 Harry 的电话号码

  其它关联容器的应用还包括将 URLs 映射到 IP 的 DNS 服务器,字典,库存清单,工资表等等。那么如何突破整型索引的局限,实现用其它数据类型作为索引的关联容器呢?答案是:使用 <map> 库创建和处理关联容器。

Pair 和 Map
  最近的一篇文章中,我介绍了 tuple 的概念,它是不同类型元素的集合。在这篇文章中,有一个内容没有提到,那就是 C++98 标准库已经具备一个特殊的 tuple 类型——pair。它将键值(也就是第一个元素)与某个值(第二个值)关联。例如:

#include <utility> //definition of pair#include <string>pair <string, string> prof_and_course("Jones", "Syntax");pair <int, string> symbolic_const (0, "false");

标准库还定义了一个辅助函数,方便 pair 类型的创建:

string prof;string course;make_pair(prof,course);//returns pair <string,string>

第一步:构造和初始化一个 map 对象
  假设你正在开发一个地址簿程序,地址簿包含姓名和 e-mail 地址。类模板 map 在 <map> 中定义i,它是一个使用类型对的关联容器,第一个元素是索引,第二个元素是关联的值。使用方法如下:

#include <map>map <string, string> addresses;

为了添加元素,使用下标算符:

addresses["Paul W."]="[email protected]";

  这里,串“Paul W.”是索引或键值,“[email protected]”是其关联的值。如果该 map 已经包含了此键值,那么当前所关联的值不会改变: 

addresses["Paul W."]="[email protected]"; // 不起作用

第二步:搜索
  在不插入元素的情况下,如果你想检查某个元素是否存在,可以使用 find()成员函数。find()有两个重载的版本:

iterator find(const key_type& k);const_iterator find(const key_type& k) const;

通常,用 typedef 可以使代码更可读一些:

typedef map <string, string>::const_iterator CIT;CIT cit=addresses.find("Paul W.");if (cit==addresses.end()) cout << "sorry, no such key" << endl;else cout << cit->first << ''\t'' << cit->second << endl;

表达式中 cit->first 和 cit->second 分别返回键值及其关联的值。

第三步:元素遍历
  现在让我们看一个更现实的情况。假设你正在经营一家旅行社,每一个代理做一单业务都可以获得奖金。这些代理的信息存储在某个文件中,其格式如下:

Bob 35Bob 90Jane 80.25Sue 100Jane 65.5

  你的应用程序必须汇总所有代理的奖金并将每个代理的奖金总数显示出来.首先,创建一个 map,然后读取该数据文件:

map <string, double> bonuses;string agent;double bonus=0;ifstream bonusfile("bonuses.dat");if(!bonusfile){ // 报告