首页 > 编程笔记

C++ map和multimap容器的使用

map 与 multimap 容器中存储的是元素对(key-value),因此 map 和 multimap 容器通常也被理解为关联数组,可以使用键(key)作为下标获取对应的值(value)。

关联的本质在于元素的值与某个特定的键相关联,而不是通过位置索引获取元素。下面讲解 map 和 multimap 容器的创建及常用操作方法。

 创建map与multimap容器

map 与 multimap 重载了多个构造函数,因此 map 和 multimap 容器的创建方式有多种。

map 容器的创建方式主要有以下五种:
map<T1,T2> m;                //创建一个空的 map 容器
map<T1,T2,op> m;             //创建一个空的 map 容器,以 op 为准则排序
map<T1,T2> m(begin,end);     //创建一个 map 容器,用 [begin, end) 区间赋值
map<T1,T2> m(begin,end,op);  //创建一个 map 容器,用 [begin, end) 区间赋值,op 为排序准则
map<T1,T2> m(m1);            //创建一个 map 容器,用另一个 map 容器 m1 初始化

下面分别用五种方式创建 map 容器,示例代码如下所示:
map<int, int> m1;
map<char, float, greater<int>()> m2;
map<string, int> m3(begin, end);
map<string, int, greater<string>()> m4(begin, end);
map<int, int> m5(m1);
上述代码分别调用不同的构造函数创建了五个 map 容器。需要注意的是,创建 map 容器时,类型参数必须有两个,这两个类型参数可以相同,也可以不同。

multimap 容器的创建方式与 map 容器相同,创建 multimap 容器的示例代码如下所示:
multimap<int, int> mt1;
multimap<char, float, greater<int>()> mt2;
multimap<string, int> mt3(begin, end);
multimap<string, int, greater<string>()> mt4(begin, end);
multimap<int, int> mt5(m1);

容器大小

map 和 multimap 容器提供了 max_size() 函数size() 函数count() 函数,其中 max_size() 函数和 size() 函数用于计算容器最大存储量和容器实际元素个数;count() 函数用于统计指定元素的个数。

这三个函数调用形式如下所示:
m.count(key);
m.max_size();
m.size();
由于 map 容器中无重复元素,因此 map 容器的 count() 函数返回值只有 0 和 1,而 multimap 容器的 count() 函数返回值可能大于 1。

容器元素的访问

map 容器重载了“[]”运算符,可以通过 m[key] 的方式获取 key 对应的值。

此外,map 容器也提供了 at() 函数用于访问指定键对应的值。例如,访问 key 对应的值,示例代码如下:
m[key];
m.at(key);
map 容器可以通过上述两种方式随机访问容器中元素,但 multimap 容器中允许存在重复的键值,因此无法使用上述两种方式随机访问容器中元素。

通过“[]”运算符和 at() 函数可以访问 map 容器中的元素,那么同样通过“[]”运算符和 at() 函数可以修改容器中的元素,示例代码如下:
m[key] = value;  
m.at(key) = value
如果 key 尚未存在,则插入元素对;如果 key 已存在,则新插入的 value 覆盖 key 原来的值。

容器的迭代器

map 与 multimap 容器支持迭代器操作,提供了 iteratorconst_iteratorreverse_iteratorconst_reverse_iterator 四种迭代器,并且提供了获取这四种迭代器的成员函数。

map 与 multimap 迭代器用法与 vector 迭代器相同。

插入和删除元素

map 和 multimap 容器提供了成员函数 insert() 用于插入元素,insert() 函数主要有三种重载形式,示例代码分别如下所示:
m.insert(elem);         //在容器中插入元素elem
m.insert(pos, elem);    //在pos位置插入元素elem
m.insert(begin, end);   //在容器中插入[begin, end)区间的值
由于 map 和 multimap 容器中存储的是键值对,因此其插入函数 insert() 与其他容器的稍有不同,每次插入的是一对元素,参数中的 elem 指的是一对元素。

在插入元素时,使用 pair<> 语句或 make_pair() 函数创建一个 pair 对象,将 pair 对象作为 insert() 函数的参数,插入容器中。

与 insert() 函数相对应,map 与 multimap 容器也提供了 erase() 函数用于删除容器中的元素,erase() 函数主要有三种重载形式,示例代码分别如下所示:
m.erase(pos);   //删除pos位置上的元素
m.erase(begin, end);   //删除[begin, end)区间内的元素
m.erase(key);   //删除键为key的元素对

示例

下面通过案例演示 map 和 multimap 容器的用法,C++ 代码如下:
#include<iostream>
#include<map>
#include<functional>
#include<string>
using namespace std;
//定义printm()函数输出map容器元素
void printm(map<char, double> mymap)
{
    pair<char, double> p;   //创建pair对象p
    map<char, double>::iterator it;   //定义map的iterator迭代器it
    for(it = mymap.begin(); it != mymap.end(); it++)
    {
        p = (pair<char, double>)*it;   //将迭代器指向的一对元素存放到p中
        cout << p.first << "->" << p.second << endl;  //输出一对元素
    }
}
//定义printmt()函数输出multimap容器元素
void printmt(multimap<int, string> mymul)
{
    pair<int, string> p;
    multimap<int, string>::iterator it;
    for(it = mymul.begin(); it != mymul.end(); it++)
    {
        p = (pair<int, string>)*it;
        cout << p.first << "->" << p.second << endl;
    }
}
int main()
{
    map<char, double> m;   //创建一个map容器m
    //向容器m中插入元素
    m['a'] = 1.2;
    m['b'] = 3.6;
    m['c'] = 6.4;
    m['d'] = 0.8;
    m['e'] = 5.3;
    m['f'] = 3.6;
    cout << "map: " << endl;
    printm(m);   //调用printm()函数输出容器m中的元素
    cout << "map中key=a的值:" << m.at('a') << endl;
    cout << "map中key=f的元素个数:" << m.count('f') << endl;
    multimap<int, string> mt;   //创建一个multimap容器mt
    //向容器mt中插入元素
    mt.insert(pair<int, string>(1, "Hello"));
    mt.insert(make_pair(1, "China"));
    mt.insert(make_pair(2, "!"));
    cout << "multimap: " << endl;
    printmt(mt);   //调用printmt()函数输出容器mt中的元素
    return 0;
}
运行结果:

map:
a->1.2
b->3.6
c->6.4
d->0.8
e->5.3
f->3.6
map中key=a的值:1.2
map中key=f的元素个数:1
multimap:
1->Hello
1->www.weixueyuan.net
2->!

示例分析:

优秀文章