定义于头文件
template< class Key, class T, class Compare = std::less, class Allocator = std::allocator > > class multimap; | (1) | |
namespace pmr { template > using multimap = std::multimap std::pmr::polymorphic_allocator>>; } | (2) | (C++17 起) |
multimap 是关联容器,含有关键-值 pair 的已排序列表,同时容许多个入口拥有同一关键。按照应用到关键的比较函数 Compare
排序。搜索、插入和移除操作拥有对数复杂度。
拥有等价关键的关键-值 pair 的顺序就是插入顺序,且不会更改。(C++11 起)
凡在标准库使用比较 (Compare) 概念出,都用描述于比较 (Compare) 上的等价关系确定等价性。不精确地说,若二个对象 a
和 b
互不小于对方: !comp(a, b) && !comp(b, a)
,则认为它们等价。
成员函数
构造函数
std::multimap::multimap
multimap(); explicit multimap( const Compare& comp, const Allocator& alloc = Allocator() ); | (1) | |
explicit multimap( const Allocator& alloc ); | (1) | (C++11 起) |
template< class InputIt > multimap( InputIt first, InputIt last, const Compare& comp = Compare(), const Allocator& alloc = Allocator() ); | (2) | |
template< class InputIt > multimap( InputIt first, InputIt last, const Allocator& alloc ); | (C++14 起) |
multimap( const multimap& other ); | (3) | |
multimap( const multimap& other, const Allocator& alloc ); | (3) | (C++11 起) |
multimap( multimap&& other ); | (4) | (C++11 起) |
multimap( multimap&& other, const Allocator& alloc ); | (4) | (C++11 起) |
multimap( std::initializer_list init, const Compare& comp = Compare(), const Allocator& alloc = Allocator() ); | (5) | (C++11 起) |
multimap( std::initializer_list init, const Allocator& ); | (C++14 起) |
从各种数据源构造新容器,可选地使用用户提供的分配器 alloc
或比较函数对象 comp
。
1) 构造空容器。
2) 构造容器,使之拥有范围 [first, last)
的内容。
3) 复制构造函数。构造容器,使之拥有 other
的内容副本。若不提供 alloc
,则通过调用 std::allocator_traits::select_on_container_copy_construction(other.get_allocator()) 获得分配器。
4) 移动构造函数。用移动语义构造容器,使之拥有 other
的内容。若不提供 alloc
,则从属于 other
的分配器移动构造分配器
5) 构造容器,使之拥有 initializer_list init
的内容。
参数
alloc | - | 用于此容器所有内存分配的分配器 |
comp | - | 用于所有关键比较的比较函数对象 |
first, last | - | 复制元素来源的范围 |
other | - | 要用作源以初始化容器元素的另一容器 |
init | - | 用以初始化容器元素的 initializer_list |
类型要求 |
- InputIt 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。 |
- Compare 必须满足比较 (Compare) 的要求。 |
- Allocator 必须满足分配器 (Allocator) 的要求。 |
复杂度
1) 常数。
2) N log(N) ,其中通常有 N = std::distance(first, last) ,若范围已为 value_comp()
所排序则与 N
成线性。
3) 与 other
的大小成线性。
4) 常数。若给定 alloc
且 alloc != other.get_allocator() 则为线性。
5) N log(N) ,其中通常有 N = init.size()) ,若 init
已按照 value_comp()
排序则与 N
成线性 。
异常
对 Allocator::allocate
的调用可能抛出。
注意
在容器移动构造(重载 (4) )后,指向 other
的引用及迭代器(除了尾迭代器)保持合法,但指代现于 *this 中的元素。当前标准由 [container.requirements.general]/12 中的总括陈述作出此保证,而 LWG 2321 正在考虑更严格的保证。
析构函数
std::multimap::~multimap
销毁容器。调用元素的析构函数,然后解分配所用的存储。注意,若元素是指针,则不销毁所指向的对象。
复杂度
与容器大小成线性。
调用示例
#include
#include
#include
#include
#include
#include
#include