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

2016-01-29 12:28 15 1 收藏

使用 <map> 库创建关联容器,使用 &lt;map&gt; 库创建关联容器

【 tulaoshi.com - C语言心得技巧 】

使用 <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 <stringpair <string, string prof_and_course("Jones", "Syntax");pair <int, string symbolic_const (0, "false");

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
string prof;string course;make_pair(prof,course);//returns pair <string,string

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

#include <mapmap <string, string addresses;

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

addresses["Paul W."]="paul@mail.com";

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

addresses["Paul W."]="newaddr@com.net"; // 不起作用

第二步:搜索
  在不插入元素的情况下,如果你想检查某个元素是否存在,可以使用 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,然后读取该数据文件:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
map <string, double bonuses;string agent;double bonus=0;ifstream bonusfile("bonuses.dat");if(!bonusfile){    // 报告
                        

来源:http://www.tulaoshi.com/n/20160129/1486271.html

延伸阅读
标签: Web开发
HTML5的video虽然可用controls来展示控件,并进行控制播放暂停等,但是不同的浏览器显示的效果可能不一样,所以很多时候我们需要使用Dom来进行自定义的一些操作和控制。下面是一个小例子。 当然效果不是很美观,若想好看的可以自己设置css样式等。 代码如下: div id="video_div" style="text-align:center;" button onclick="playPause()...
标签: Web开发
这个标签可以在屏幕上显示一条水平线,用以分割页面中的不同部分。 HR有三个属性: size 水平线的宽度 width 水平线的长,用占屏幕宽度的百分比或象素值来表示 align 水平线的对齐方式,有LEFT RIGHT CENTER三种 noshade 线段无阴影属性,为实心线段 我们可以用几个例子来说明这线段的用法: Webjx.Co...
    C语言中有一些函数不需要进行编译,有一些函数也可以在多个文凭中使用。一般来说,这些函数都会执行一些标准任务,如数据库输入/输出操作或屏幕控制等。可以事先对这些函数进行编译,然后将它们放置在一些非凡的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不...
  什么是数据库? 数据库是以某种文件结构存储的一系列信息表,这种文件结构使您能够访问这些表、选择表中的列、对表进行排序以及根据各种标准选择行。数据库通常有多个 索引与这些表中的许多列相关联,所以我们能尽可能快地访问这些表。  以员工记录为例,您可以设想一个含有员工姓名、地址、工资、扣税以及津贴等内容的...
标签: Web开发
假设现在要在表单中添加这样一项内容:浏览所在的城市。这里不说全国的城市,只说省会以上的城市就有几十个。如果以上面讲过的单选按钮的形式,将这些城市全部罗列在网页上,将是一件不堪设想的事情。于是在表单的对象中出现了菜单和列表。说到底,菜单和列表主要是为了节省网页的空间而产生的。 菜单是一种最节省空间的方式,正常状态下只能...

经验教程

69

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部