C++ コンテナ - 辞書 (マルチマップ)

1 はじめに

マルチマップは、ソートされたキーと値のペア、つまり (キー, 値) を含む連想コンテナであり、同じキー値を許可し、キー値に従って内部的にソートされます。追加、変更、クエリには対数的な時間計算量があり、そのストレージ構造は赤黒の木。

ヘッダー ファイルと定義

#include <map>

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T>>
> class multimap;

2. 初期化

初期化方法は以下の通りです

#include <iostream>
#include <string>
#include <map>

template<typename T>
void showInfo(T &t)
{
    
    
        auto iter = t.begin();
        while (iter != t.end())
        {
    
    
                std::cout<<"["<<iter->first<<", "<<iter->second<<"]; ";
                iter++;
        }
        std::cout<<std::endl;
}

int main()
{
    
    
    //允许重复的数据出现,但是内部会对其进行排序
    std::multimap<int32_t, std::string> mm1{
    
    {
    
    1,"c"},{
    
    2,"linux"},{
    
    1,"c++"},{
    
    1,"c++"},{
    
    2,"linux"}};
    showInfo(mm1);

    std::multimap<int32_t, std::string> mm2 = mm1;
    showInfo(mm1);

    std::multimap<int32_t, std::string> mm3;        
    mm3.emplace(std::make_pair(1, "teacher"));
    mm3.emplace(std::make_pair(1, "student"));
    mm3.insert({
    
    3, "boy"});
    mm3.emplace(std::pair<int32_t, std::string>(4, "girl"));
    mm3.emplace_hint(mm3.begin(), std::make_pair(5, "class"));
    showInfo(mm3);    

    return 0;
}

出力

[1, c]; [1, c++]; [1, c++]; [2, linux]; [2, linux];
[1, c]; [1, c++]; [1, c++]; [2, linux]; [2, linux];
[1, teacher]; [1, student]; [3, boy]; [4, girl]; [5, class];

3.使用する

サポートする操作のほとんどはmapと同じですが、以下の点が異なります;
set と比較すると、 count() が便利です; find() は最初の要素が出現する時間を検索します。

  • マルチマップではデータの重複が許可されており、添字を介してアクセスできないため、マルチマップは at() と Operator[] をサポートしません。
  • マルチマップは try_emplace をサポートしません (C++17)

マルチマップは添字アクセスをサポートしていないため、要素にアクセスするにはどうすればよいでしょうか? 現時点では、find()、count()、equal_range()、 lower_bound()、および upper_bound() が機能します。

int main()
{
    
    
    std::multimap<int32_t, std::string> mm1{
    
    {
    
    1,"c"},{
    
    2,"linux"},{
    
    1,"c++"},{
    
    1,"c++"},{
    
    2,"linux"}, {
    
    2,"python"},{
    
    1,"matlab"}};
    showInfo(mm1);

    //1. 通过lower_bound和upper_bound输出元素相同的数据
    std::cout<<"[1]\n";
    auto lower_iter = mm1.lower_bound(1);
    auto upper_iter = mm1.upper_bound(1);

    decltype(lower_iter) m;    //decltype自动推导出m的类型
    
    for(m = lower_iter; m != upper_iter; m++)
    {
    
    
        std::cout<<"["<<m->first<<", "<<m->second<<"]; ";
    }
    std::cout<<std::endl<<std::endl;

    //2. 通过equal_range来查找元素
    std::cout<<"[2]\n";
    auto equal_iter = mm1.equal_range(1);
    auto lower_iter_1 = equal_iter.first;
    auto upper_iter_2 = equal_iter.second;

    decltype(lower_iter_1) m_1;

    for(m_1 = lower_iter_1; m_1 != upper_iter_2; m_1++)
    {
    
    
        std::cout<<"["<<m_1->first<<", "<<m_1->second<<"]; ";
    }
    std::cout<<std::endl<<std::endl;

    //3. find() 和 count()
    std::cout<<"[3 ]\n";
    auto iter = mm1.find(1);
    if(iter != mm1.end())
    {
    
    
        for(size_t i = 0;i <mm1.count(1);i++)
        {
    
    
            std::cout<<"["<<iter->first<<", "<<iter->second<<"]; ";
            iter++;
        }
    }
    std::cout<<std::endl;    

    return 0;
}

出力

[1, c]; [1, c++]; [1, c++]; [1, matlab]; [2, linux]; [2, linux]; [2, python];
[1]
[1, c]; [1, c++]; [1, c++]; [1, matlab];

[2]
[1, c]; [1, c++]; [1, c++]; [1, matlab];

[3]
[1, c]; [1, c++]; [1, c++]; [1, matlab];

おすすめ

転載: blog.csdn.net/shouhu010/article/details/129731127