C++容器之多重映射(std::multimap)

发布于:2024-05-24 ⋅ 阅读:(143) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到