实用的关联容器

前言

  我们可以用下标访问顺序容器的元素,也就是说在顺序容器实现中下标和元素的值相关联。那么能不能让别的值(而不是下标)与元素的值相关联呢?有的,实现这种功能的容器就叫做关联容器,而关联的本质就是某个特定的“键”与元素的值相关联。

常见的关联容器

  1. map:也即关联数组,是键 - 值的集合

  2. set:纯键的集合

  3. multimap:map容器的“ 一键对多值 “版本

  4. multiset:set容器的” 一键对多值 “版本

关联容器的特性

  1. 下标访问不存在将导致容器中增加一个新的元素

  2. 可以使用count和find函数对键进行检索操作(这个特性说明可以把键看成索引)

map容器使用范例

  下面这个程序是一个微型的电话簿。该程序从当前目录载入电话簿存档文件,允许用户通过姓名在电话簿中查找其对应的电话号码并告知用户。示例电话簿文件如下:

  

  源代码:

#include <iostream>
#include <fstream>
#include <string>
#include <map>

using namespace std;

int main()
{
    cout << "请输入电话簿存档文件名: ";
    string filename;
    cin >> filename;

    /*
     * 打开文件
    */
    fstream io;
    io.open(filename.c_str());
    if (!io) {
        cout << "打开存档文件失败!" << endl;
        return 1;
    }

    /*
     * 将电话簿存至map容器
    */
    map<string, string> telbook;
    string name;
    string tel;
    while (io >> name) {
        io >> tel;
        // 注意这里下标使用的编程意义
        telbook[name] = tel;
    }
    // 记得关闭流
    io.close();
    cout << "电话簿文件载入完毕" << endl;

    /*
     * 获取查询对象并返回查询结果
    */
    map<string, string>::iterator it;
    while (1) {
        cout << "请输入查询对象( 输入#退出 ): " << endl;
        cin >> name;
        if (name == "#") break;
        // 检索操作
        it = telbook.find(name);
        if (it!=telbook.end()) 
            cout << "查找结果: " << it->second << endl << endl;
        else
            cout << "找不到任何记录" << endl << endl;
    }
        
    return 0;
}

  运行结果:

  

说明

  1. set容器的基本操作和map基本相同,只是其元素为纯键

  2. multimap和multiset需要注意的地方是那个find函数,我将在下篇随笔中详细讲解。 点此传送

posted on 2014-02-12 22:32  空山悟  阅读(288)  评论(0编辑  收藏  举报

导航