目录
- 1 概述
- 2 使用实例
- 3 接口使用
-
- 3.1 construct
- 3.2 assigns
- 3.3 iterators
- 3.4 capacity
- 3.5 insert
- 3.6 erase
- 3.7 swap
- 3.8 clear
- 3.9 emplace
- 3.10 emplace_hint
- 3.11 key_comp
- 3.12 value_comp
- 3.13 find/count
- 3.14 lower_bound/upper_bound/equal_range
- 3.15 get_allocator
1 概述
多重映射是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序,并且其中多个元素可以具有等效键。
在多重映射中,键值通常用于对元素进行排序和唯一标识,而映射的值存储与该键关联的内容。键和映射值的类型可能不同,并在成员类型value_type中分组在一起,该类型是将两者组合在一起的对类型:
typedef pair<const Key,T> value_type;
&emsp在内部,多重映射中的元素总是按照其键进行排序,遵循由其内部比较对象(类型为Compare)指示的特定严格弱排序标准。
multimap容器通常比unordered_multimap容器通过关键字访问单个元素的速度慢,但它们允许根据子集的顺序直接迭代
多重映射通常被实现为二叉搜索树
其类图如下:
2 使用实例
void MultiMapSuite::find()
{
std::multimap<char, int> a = {
{
'e', 45 }, {
'e', 50 }, {
'a', 10 }, {
'b', 20 }, {
'c', 30 }, {
'd', 40 } };
auto it = a.find('e');
TEST_ASSERT_EQUALS('e', it->first)
TEST_ASSERT_EQUALS(45, it->second)
it = a.find('h');
TEST_ASSERT_EQUALS(true, it == a.end())
}
void MultiMapSuite::count()
{
std::multimap<char, int> a = {
{
'e', 50 }, {
'e', 55 }, {
'a', 10 }, {
'b', 20 }, {
'c', 30 }, {
'd', 40 } };
TEST_ASSERT_EQUALS(2, a.count('e'))
TEST_ASSERT_EQUALS(0, a.count('h'))
}
3 接口使用
3.1 construct
namespace helper_of_multimap {
bool function_compare(char l, char r) {
return l < r; }
struct object_compare
{
bool operator()(const char& l, const char& r) {
return l < r; }
};
}
void MultiMapSuite::construct()
{
std::multimap<char, int> a;
std::multimap<char, int> b = {
{
'a', 10 }, {
'b', 20 }, {
'c', 30 }, {
'd', 40 }, {
'e', 50}};
std::multimap<char, int> c(b.begin(), b.end());
std::multimap<char, int> d(b);
std::multimap<char, int> e({
{
'a', 10 }, {
'b', 20 }, {
'c', 30 }, {
'd', 40 }, {
'e', 50 }, {
'a', 10 } });
std::multimap<char, int, helper_of_multimap::object_compare> f;
std::multimap<char, int, bool(*)(char, char)> g(helper_of_multimap::function_compare);
TEST_ASSERT_EQUALS(true, a.empty())
TEST_ASSERT_EQUALS(5, b.size())
TEST_ASSERT_EQUALS(5, c.size())
TEST_ASSERT_EQUALS(5, d.size())
TEST_ASSERT_EQUALS(6, e.size())
TEST_ASSERT_EQUALS(true, f.empty())
TEST_ASSERT_EQUALS(true, g.empty())
}
说明:
- 构造时可以指定函数对象作为比较函数
- 构造时可以指定函数指针作为比较函数
3.2 assigns
void MultiMapSuite::assigns()
{
std::multimap<char, int> a = {
{
'a', 10 }, {
'b', 20 }, {
'c', 30 }, {
'd', 40 }, {
'e', 50 }, {
'e', 60 } };
std::multimap<char, int