C++ map和multimap容器的使用
map 与 multimap 容器中存储的是元素对(key-value),因此 map 和 multimap 容器通常也被理解为关联数组,可以使用键(key)作为下标获取对应的值(value)。
关联的本质在于元素的值与某个特定的键相关联,而不是通过位置索引获取元素。下面讲解 map 和 multimap 容器的创建及常用操作方法。
map 容器的创建方式主要有以下五种:
下面分别用五种方式创建 map 容器,示例代码如下所示:
multimap 容器的创建方式与 map 容器相同,创建 multimap 容器的示例代码如下所示:
这三个函数调用形式如下所示:
此外,map 容器也提供了 at() 函数用于访问指定键对应的值。例如,访问 key 对应的值,示例代码如下:
通过“[]”运算符和 at() 函数可以访问 map 容器中的元素,那么同样通过“[]”运算符和 at() 函数可以修改容器中的元素,示例代码如下:
map 与 multimap 迭代器用法与 vector 迭代器相同。
在插入元素时,使用
与 insert() 函数相对应,map 与 multimap 容器也提供了
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
关联的本质在于元素的值与某个特定的键相关联,而不是通过位置索引获取元素。下面讲解 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 容器支持迭代器操作,提供了iterator
、const_iterator
、reverse_iterator
和 const_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->!
- 第 7~16 行代码定义了 printm() 函数,用于输出 map<char,double> 容器元素。在 printm() 函数内部,第 9 行代码创建了 pair<char,double> 对象 p;第 10 行代码定义了 map 的 iterator 迭代器 it。第 11~15 行代码在 for 循环中遍历 map 容器的元素,将元素赋值给对象 p,并输出对象 p 表示的元素对;
-
第 18~27 行代码定义了 printmt() 函数,用于输出 multimap 容器元素。
printmt()
函数和printm()
函数的实现原理相同; - 第 30~37 行代码定义了 map 容器 m,并通过索引方式插入元素;
- 第 39 行代码调用 printm() 函数输出容器 m 中的元素;
- 第 40 行代码调用 at() 函数查找键 'a' 对应的值;
- 第 41 行代码计算键 'f' 的个数。
- 第 42 行代码创建 multimap 容器 mt;
-
第 44~46 行代码调用 insert() 函数插入元素。需要注意的是,第 44 行代码插入元素时,使用
pair<>
语句构建元素对; - 第 45~46 行代码插入元素时,调用 make_pair() 函数构建元素对;
- 第 48 行代码调用 printmt() 函数输出容器 mt 中的元素。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。