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

摘要:当索引是整型,那么将值与之关联并不难,但如果数据的关联值对是其它数据类型怎么办呢?<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."]="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 分别返回键值及其关联的值。

时间: 2024-10-05 09:40:51

使用 &lt;map&gt; 库创建关联容器的相关文章

使用 &amp;lt;multimap&amp;gt; 库创建重复键关联容器

摘要:标准库的 multimap 容器与 map 关联容器非常类似--但是, multimap 允许重复键.这个特性使得 multimap 比想象的要有用得多.本文将对之进行探讨 . 在"使用 <map> 库创建关联容器"一文中,我们讨论了标准库 中的 map 关联容器.但那只是 map 容器的一部分.标准库还定义了一个 multimap 容器, 它与 map 类似,所不同的是它允许重复键.这个属性使得 multimap 比预想的要更有用:比 如在电话簿中相同的人可以有两个

C++中 set,multiset,map,multimap 关联容器实例教程

测试环境:windows 7 vs2010 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 除了各容器都有的函数外,还支持以下成员函数: find: 查找等于某个值的元素(x小于y和y小于x同时不成立即为相等)lower_bound: 查找某个下界upper_bound: 查找某个上界equal_range: 同时查找上界和下界count:计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等)insert: 用以插入一个元素或一个区间 在学习关联容器之前,我们先要学习pa

STL之关联容器

 关联容器支持高效的关键字查找和访问.两个主要的关联容器(associative-container)类型是map和set.标准库提供8个关联容器,它们的不同体现在三个维度上: 或者是一个set,或者是一个map 或者要求不重复的关键字,或者允许重复关键字 按顺序保存元素,或无序保存. 允许重复关键字的容器的开头名字中都包含单词multi:不保持关键字按顺序存储的容器的名字都以单词unordered开头. 类型map和multimap定义在头文件map中:set和multiset定义在头文件se

[C++ 面试基础知识总结] 关联容器

[C++ 面试基础知识总结] 关联容器 参考书籍:<C++ Primer> 目录 C 面试基础知识总结 关联容器 目录 关联容器类型 关联容器概述 定义关联容器 关键字类型的要求 pair 关联容器操作 关联容器迭代器 添加元素 删除元素 访问元素 无序容器 关联容器类型 标准库共提供了8个关联容器 map 关联数组:保存关键字-值对 set 关键字即值,即只保存关键字的容器 multimap 关键字可重复出现的map multiset 关键字可重复出现的set unordered_map 用

关联容器概述

关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的.与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的. 虽然关联容器的很多行为与顺序容器相同,但其不同之处反映了关键字的作用. 关联容器支持高效的关键字查找和访问.两个主要的关联容器类型是map和set.map中的元素是一些关键字-值对:关键字起到索引的作用,值则表示与索引相关联的数据.set中每个元素包含一个关键字:set支持高效的关键字查询操作--检查一个给定关键字是否在set中.例如,在某些文本处理过

C++程序设计:原理与实践(进阶篇)16.6 关联容器

16.6 关联容器 除了vector之外,最有用的标准库容器恐怕就是map了.一个map就是一个(键,值)对的有序序列,你可以基于一个关键字在其中查找对应的值:例如my_phone_book["Nicholas"]应该是Nicholas的电话号码.在流行度的竞争中,map唯一的潜在竞争对手是unordered_map(见16.6.4节),它是一种针对字符串关键字优化过的map.类似map和unordered_map的数据结构有很多名字,例如关联数组(associative array)

关联容器操作

关联容器还定义了如下表所示的类型.这些类型表示容器关键字和值的类型. 关联容器额外的类型别名 key_type 此容器类型的关键字类型 mapped_type  每个关键字关联的类型:只适用于map value_type 对于set,与key_type相同 对于map,为pair<const key_type,mapped_type> 对于set类型,key_type和value_type是一样的:set中保存的值就是关键字.在一个map中,元素是关键字-值对.即,每个元素是一个pair对象,

使用Windows Javascript库创建自定义控件

如果您已经用Javascript开发过windows store app程序,那么您肯定使用过Windows Javascript 库(WinJS).这个库提供了一组CSS样式.Javascript控件以及工具, 可以帮助您快速地创建符合UX准则的windows store app. 这里工具是一组函数,您可以使用这组函数来创建自定义控件. 您可以使用任何您喜欢的模式或者库来编写JavaScript控件,WinJS提供的库函数仅仅是您的选择之一.使用WinJS库创建自定义控件的一个最大的好处是该

有一个节点,我想问在gephi软件中能不能实现一个节点自己与自己创建关联网络

问题描述 有一个节点,我想问在gephi软件中能不能实现一个节点自己与自己创建关联网络 有一个节点,我想问在gephi软件中能不能实现一个节点自己与自己创建关联网络