C++容器——字典(unordered_multimap)

1. 简介

unordered_multimap是一种关联式容器,键值对(key, value)允许重复;增加、修改和查询具有线性的时间复杂度,其存储结构为哈希;元素的存储并未按照特定的顺序,而是被组织到桶中,在哪个桶中取决于其散列值;

头文件和定义

#include <unordered_map>

template<
    class Key,
    class T,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_multimap;

2. 初始化

unordered_multimap的初始化方法如下所示

/*
 * @brief:    unordered_map
*  @compile:  g++ -g unordered_multimap_main.cc -o d -std=c++11
*  @author:   your name
*  @date:     2023/03/31
 * @lastEditorDate: 
*/

#include <iostream>
#include <unordered_map>
#include <string>
#include <iterator>
#include <functional>

using sstring = std::string;

void printEnd(int32_t n)
{
    
    
    for(int32_t i = 0; i < n; i++){
    
    std::cout<<std::endl;}    
}
std::function<void(int32_t)> e = printEnd;

template<typename T>
void showInfo(T &t)
{
    
    
    for(const auto& au : t)
    {
    
            
       std::cout<<"["<<au.first<<" ,"<<au.second<<"]; ";
    }
}

int main(int argc, char *argv[])
{
    
       
    //直接初始化
    std::unordered_multimap<sstring, sstring> un_m1{
    
    {
    
    "1", "c"}, {
    
    "3", "c++"}, {
    
    "3", "c++"}, {
    
    "3", "c++"}, {
    
    "5", "matlab"}, {
    
    "7", "linux"}, {
    
    "10", "Rust"}};
    std::cout<<"[un_m1]";e(1);
    showInfo(un_m1);e(2);

    std::unordered_multimap<sstring, sstring> un_m2;
    un_m2.insert(std::make_pair("class_1", "student"));
    un_m2.insert(std::make_pair("class_1", "teacher"));
    un_m2.emplace(std::make_pair("class_2", "student"));
    un_m2.insert(std::make_pair("class_2", "teacher"));
    std::cout<<"[un_m2]";e(1);
    showInfo(un_m2);e(2);

    //拷贝初始化
    std::unordered_multimap<sstring, sstring> un_m3 = un_m2;
    std::cout<<"[un_m3]";e(1);
    showInfo(un_m2);e(1);

    return 0;
}

输出

[un_m1]
[10 ,Rust]; [7 ,linux]; [5 ,matlab]; [3 ,c++]; [3 ,c++]; [3 ,c++]; [1 ,c];

[un_m2]
[class_2 ,teacher]; [class_2 ,student]; [class_1 ,teacher]; [class_1 ,student];

[un_m3]
[class_2 ,teacher]; [class_2 ,student]; [class_1 ,teacher]; [class_1 ,student];

3. 使用

其支持的操作与unordered_map大部分一样,但是有以下几点是不同的;

  • unordered_multimap不支持 insert_or_assign try_emplace,数据允许重复,都可以写入进去
  • unordered_multimap不支持 operator[]和at,数据是允许重复的,通过下标无法锁定对应元素

unordered_multimap元素的访问
示例

int main(int argc, char *argv[])
{
    
       
    //直接初始化
    std::unordered_multimap<sstring, sstring> un_m1{
    
    {
    
    "class_1", "student"}, {
    
    "class_1", "teacher"}, {
    
    "class_1", "scoure"}, \
                                                    {
    
    "class_2", "student"}, {
    
    "class_2", "teacher"}, {
    
    "class_2", "scoure"}, \
                                                    {
    
    "class_3", "student"}, {
    
    "class_3", "teacher"}, {
    
    "class_3", "scoure"}, \
                                                    {
    
    "class_4", "student"}, {
    
    "class_4", "teacher"}, {
    
    "class_4", "scoure"}};
    std::cout<<"[un_m1]";e(1);
    showInfo(un_m1);e(2);

    //1.通过find()和count()来遍历元素
    auto iter = un_m1.find("class_3");
    for(size_t i = 0;i<un_m1.count("class_3"); i++)
    {
    
    
        std::cout<<"["<<iter->first<<", "<<iter->second<<"]; ";
        std::advance(iter, 1);        
    }
    e(2);

    //2.通过equal_range()遍历元素
    auto equal_iter = un_m1.equal_range("class_2");
    auto iter_begin = equal_iter.first;    
    while(iter_begin != equal_iter.second)
    {
    
    
        std::cout<<"["<<iter_begin->first<<", "<<iter_begin->second<<"]; ";
        std::advance(iter_begin, 1);
    }
    e(1);   

    return 0;
}

输出

[un_m1]
[class_4 ,scoure]; [class_4 ,teacher]; [class_4 ,student]; [class_3 ,scoure]; [class_3 ,teacher]; [class_3 ,student]; [class_2 ,scoure]; [class_2 ,teacher]; [class_2 ,student]; [class_1 ,scoure]; [class_1 ,teacher]; [class_1 ,student];

[class_3, scoure]; [class_3, teacher]; [class_3, student];

[class_2, scoure]; [class_2, teacher]; [class_2, student];

猜你喜欢

转载自blog.csdn.net/shouhu010/article/details/129795433