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

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

VC++ 中的 使用 <multimap> 库创建重复键关联容器


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

使用 <multimap> 库创建重复键关联容器

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

原文出处:Use multimap to Create Associative Containers with Duplicate Keys

摘要:标准库的  multimap 容器与 map 关联容器非常类似——但是,multimap 允许重复键。这个特性使得 multimap 比想象的要有用得多。本文将对之进行探讨。



  在“使用 <map> 库创建关联容器”一文中,我们讨论了标准库中的 map 关联容器。但那只是 map 容器的一部分。标准库还定义了一个 multimap 容器,它与 map 类似,所不同的是它允许重复键。这个属性使得 multimap 比预想的要更有用:比如在电话簿中相同的人可以有两个以上电话号码,文件系统中可以将多个符号链接映射到相同的物理文件,或DNS服务器可以将几个URLs映射到相同的IP地址。在这些场合,你可以象下面这样:
// 注: 伪码multimap <string, string> phonebook;phonebook.insert("Harry","8225687"); // 家里电话phonebook.insert("Harry","555123123"); // 单位电话phonebook.insert("Harry"," 2532532532"); // 移动电话

  在 multimap 中能存储重复键的能力大大地影响它的接口和使用。那么如何创建非唯一键的关联容器呢?答案是使用在 <map> 库中定义的 multimap 容器。

提出问题
  与 map 不同,multimap 可以包含重复键。这就带来一个问题:重载下标操作符如何返回相同键的多个关联值?以下面的伪码为例:

string phone=phonebook["Harry];

  标准库设计者的解决这个问题方法是从 multimap 中去掉下标操作符。因此,需要用不同的方法来插入和获取元素以及和进行错误处理。

插入
  假设你需要开发一个 DNS 后台程序(也就是 Windows 系统中的服务程序),该程序将 IP 地址映射匹配的 URL 串。你知道在某些情况下,相同的 IP 地址要被关联到多个 URLs。这些 URLs 全都指向相同的站点。在这种情况下,你应该使用 multimap,而不是 map。例如:

#include <map>#include <string>multimap <string, string> DNS_daemon;

  用 insert() 成员函数而不是下标操作符来插入元素。insert()有一个 pair 类型的参数。在“使用 <map> 库创建关联容器”中我们示范了如何使用 make_pair() 辅助函数来完成此任务。你也可以象下面这样使用它:

DNS_daemon.insert(make_pair("213.108.96.7","cppzone.com"));

  在上面的 insert()调用中,串 “213.108.96.7”是键,“cppzone.com”是其关联的值。以后插入的是相同的键,不同的关联值:

DNS_daemon.insert(make_pair("213.108.96.7","cppluspluszone.com"));

  因此,DNS_daemon 包含两个用相同键值的元素。注意 multimap::insert() 和 map::insert() 返回的值是不同的。

typedef pair <const Key, T> value_type;iterator insert(const value_type&); // #1 multimappair <iterator, bool>insert(const value_type&); // #2 map

  multimap::insert()成员函数返回指向新插入元素的迭代指针,也就是 iterator(multimap::insert()总是能执行成功)。但是 map::insert() 返回 pair<iterator, bool>,此处 bool 值表示插入操作是否成功。

查找单个值
  与 map 类似,multimap 具备两个版本重载的 find()成员函数:

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

find(k) 返回指向第一个与键 k 匹配的 pair 的迭代指针,这就是说,当你想要检查是否存在至少一个与该键关联的值时,或者只需第一个匹配时,这个函数最有用。例如:

typedef multimap <string, string> mmss;void func(const mmss & dns){ mmss::const_iterator cit=dns.find("213.108.96.7"); if (cit != dns.end()) cout <<"213.108.96.7 found" <<endl; else cout <<"not found" <<endl; }

处理多个关联值
  count(k) 成员函数返回与给定键关联的值得数量。下