C++ STL multimap容器(深入了解,一文学会)

本文深入介绍了C++ STL中的multimap容器,包括其与map容器的相似性和区别,成员函数的使用,如begin()、end()、find()等,以及如何创建、初始化、排序和操作multimap。通过实例展示了multimap的拷贝构造函数、自定义排序规则和部分成员方法的运用。此外,还提供了与其他STL容器相关的博客链接。
摘要由CSDN通过智能技术生成

        multimap容器 和map容器,都是关联式容器。所谓“相似”,指的是 multimap 容器具有和 map 相同的特性,即 multimap 容器也用于存储 pair<const K, T> 类型的键值对(其中 K 表示键的类型,T 表示值的类型),其中各个键值对的键的值不能做修改;并且,该容器也会自行根据键的大小对存储的所有键值对做排序操作。和 map 容器的区别在于,multimap 容器中可以同时存储多(≥2)个键相同的键值对。

 

  本文作者原创,转载请附上文章出处与本文链接。

C++ STL multimap容器(深入了解,一文学会)目录

1 multimap容器的成员函数

2 multimap容器定义

3 创建multimap容器

4 multimap拷贝构造函数

5 选定某块区域内键值初始化

6 multimap 排序

7 部分成员方法的用法:


1 multimap容器的成员函数

成员方法功能
begin()返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
end()返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
rbegin()返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
rend()返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
cbegin()和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
find(key)在 multimap 容器中查找首个键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
lower_bound(key)返回一个指向当前 multimap 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
upper_bound(key)返回一个指向当前 multimap 容器中第一个大于 key 的键值对的迭代器。如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
equal_range(key)该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对。
empty() 若容器为空,则返回 true;否则 false。
size()返回当前 multimap 容器中存有键值对的个数。
max_size()返回 multimap 容器所能容纳键值对的最大个数,不同的操作系统,其返回值亦不相同。
insert()向 multimap 容器中插入键值对。
erase()删除 multimap 容器指定位置、指定键(key)值或者指定区域内的键值对。
swap()交换 2 个 multimap 容器中存储的键值对,这意味着,操作的 2 个键值对的类型必须相同。
clear()清空 multimap 容器中所有的键值对,使 multimap 容器的 size() 为 0。
emplace()在当前 multimap 容器中的指定位置处构造新键值对。其效果和插入键值对一样,但效率更高。
emplace_hint()在本质上和 emplace() 在 multimap 容器中构造新键值对的方式是一样的,不同之处在于,使用者必须为该方法提供一个指示键值对生成位置的迭代器,并作为该方法的第一个参数。
count(key)在当前 multimap 容器中,查找键为 key 的键值对的个数并返回。

2 multimap容器定义

        和map 容器一样,实现 multimap 容器的类模板也定义在<map>头文件,并位于 std 命名空间中。因此,在使用 multimap 容器前,程序应包含如下代码:

#include <map>
using namespace std;

    template < class Key,                                   // 指定键(key)的类型
               class T,                                     // 指定值(value)的类型
               class Compare = less<Key>,                   // 指定排序规则
               class Alloc = allocator<pair<const Key,T> >  // 指定分配器对象的类型
               > class multimap;

大多数场景中,我们只需要设定前 2 个参数的值,有些场景可能会用到第 3 个参数,但最后一个参数几乎不会用到。

3 创建multimap容器

	//创建并初始化 multimap 容器
	multimap<string, string>mymultimap{ {"C++", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"},
										{"QT", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"},
										{"MFC", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"} };

        注意,使用此方式初始化 multimap 容器时,其底层会先将每一个{key, value}创建成 pair 类型的键值对,然后再用已建好的各个键值对初始化 multimap 容器。

	//借助 pair 类模板的构造函数来生成各个pair类型的键值对
	multimap<string, string>mymultimap{
		pair<string,string>{"C++", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"},
		pair<string,string>{ "QT", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"},
		pair<string,string>{ "MFC", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"}
	};
	//调用 make_pair() 函数,生成键值对元素
	//创建并初始化 multimap 容器
	multimap<string, string>mymultimap{
		make_pair("C++", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"),
		make_pair("QT", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"),
		make_pair("MFC", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343")
	};

4 multimap拷贝构造函数

multimap<string, string>newmultimap(mymultimap);


    //创建一个会返回临时 multimap 对象的函数
    multimap<string, string> dismultimap() {
        multimap<string, string>tempmultimap{ {"C++", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"},{"QT", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"} };
        return tempmultimap;
    }  
    //调用 multimap 类模板的移动构造函数创建 newMultimap 容器
    multimap<string, string>newmultimap(dismultimap());

上面程序中,由于 dismultimap() 函数返回的 tempmultimap 容器是一个临时对象,因此在实现初始化 newmultimap 容器时,底层调用的是 multimap 容器的移动构造函数,而不再是拷贝构造函数。

注意,无论是调用复制构造函数还是调用拷贝构造函数,都必须保证这 2 个容器的类型完全一致。

5 选定某块区域内键值初始化

	//创建并初始化 multimap 容器
	multimap<string, string>mymultimap{ 
										{"C++", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"},
										{"QT", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"},
										{"MFC", "https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5343"} };
	multimap<string, string>newmultimap(++mymultimap.begin(), mymultimap.end());

这里使用了 multimap 容器的迭代器,选取了 mymultimap 容器中的最后 2 个键值对,用于初始化 newmultimap 容器。

multimap 容器迭代器,和 map 容器迭代器的用法完全相同,这里不再赘述。

6 multimap 排序

        multimap 类模板共可以接收 4 个参数,其中第 3 个参数可用来修改 multimap 容器内部的排序规则。默认情况下,此参数的值为std::less<T>,这意味着以下 2 种创建 multimap 容器的方式是等价的:

    multimap<char, int>mymultimap{ {'a',1},{'b',2} };
    multimap<char, int, std::less<char>>mymultimap{ {'a',1},{'b',2} };
    multimap<char, int, std::greater<char>>mymultimap{ {'a',1},{'b',2} };

multimap 容器自定义排序规则,后面章节继续讲解。

7 部分成员方法的用法:

#include <iostream>
#include <map>  //map
using namespace std;
int main()
{
	//创建并初始化 multimap 容器
	multimap<char, int>mymultimap{ {'a',10},{'b',20},{'b',15}, {'c',30} };
	//输出 mymultimap 容器存储键值对的数量
	cout << mymultimap.size() << endl;
	//输出 mymultimap 容器中存储键为 'b' 的键值对的数量
	cout << mymultimap.count('b') << endl;
	for (auto iter = mymultimap.begin(); iter != mymultimap.end(); ++iter) {
		cout << iter->first << " " << iter->second << endl;
	}
	return 0;
}

//结果
4
2
a 10
b 20
b 15
c 30

        注意,只要是 multimap 容器提供的成员方法,map 容器都提供,并且它们的用法是相同的。前面章节中已经对 map 容器提供的成员方法做了详细的讲解,因此这里不再对其它的成员方法做详细的介绍。

以下博客部分内容借鉴自:http://c.biancheng.net/stl/。

C++ STL 容器、迭代器、适配器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/120052137                                                                                C++ STL deque容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676574
C++ STL vector容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676109
C++ STL list容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118676917
C++ STL forward_list容器(深入了解,一文学会)               https://blog.csdn.net/qq_37529913/article/details/118687348
C++ STL array 容器(深入了解,一文学会)                        https://blog.csdn.net/qq_37529913/article/details/118688364
C++ STL pair 类模板(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118714852
C++ STL map容器(深入了解,一文学会)                           https://blog.csdn.net/qq_37529913/article/details/118741670
C++ STL map emplace()和emplace_hint()(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/118771777
C++ STL multimap容器(深入了解,一文学会)                    https://blog.csdn.net/qq_37529913/article/details/118773021
C++ STL Set容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118918940
C++ STL multiset容器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119624779
C++ STL unordered_map容器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/119689199
C++ STL unordered_set容器(深入了解,一文学会)           https://blog.csdn.net/qq_37529913/article/details/119709019
C++ STL unordered_multiset容器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/119709079
C++ STL stack容器适配器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119723782
C++ STL queue容器适配器(深入了解,一文学会)       https://blog.csdn.net/qq_37529913/article/details/119746246
C++ STL priority_queue容器适配器(深入了解,一文学会)                https://blog.csdn.net/qq_37529913/article/details/119770527
C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)   https://blog.csdn.net/qq_37529913/article/details/119814820
C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会)      https://blog.csdn.net/qq_37529913/article/details/119834378
C++ STL stream_iterator流迭代器(深入了解,一文学会)                  https://blog.csdn.net/qq_37529913/article/details/119834429
C++ STL streambuf_iterator流缓冲区迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119850048
C++ STL move_iterator移动迭代器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119859888
C++ STL advance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008250
C++ STL distance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008300
C++ STL iterator迭代器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008346
C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008324
C++ STL begin()和end()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008459
C++ STL prev()和next()函数(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008481
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双子座断点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值