• STL中map介绍


    本文主要介绍 C++ 编程语言的 STL(Standard Template Library) 中 map 的相关知识,同时通过示例代码介绍 map的使用方法。

    1概念

    map 是 STL 的一个关联容器,它提供一对一的数据处理能力。

    map 对象是模板类,需要关键字存储对象两个模板参数:其中第一个参数称为关键字,每个关键字只能在 map 中出现一次;第二个参数称为该关键字的值。可以将关键字和存储对象理解为“{键,值}对”。例如,学生的“学号”与“姓名”就可以用 map 进行描述,“学号”对应“关键字”,“姓名”对应“值”,具体的 map 描述信息如下:

    std::map mapStudent;
    
    • 1

    map 内部数据的组织:map 内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。

    上面语句定义了一个用 int 作为索引(关键字),并拥有相关联的指向 string 的指针。为了使用方便,可以对模板类使用 typedef 进行下面的类型定义:

    typedef map mapStudent_t;
    mapStudent_t mapStudent;
    
    • 1
    • 2

    2常见用法

    2.1 map构造函数

    map 提供了几种构造函数,通常采用下面的方式构造 map:

    typedef map mapStudent_t;
    mapStudent_t mapStudent;
    
    • 1
    • 2

    2.2 map的数据插入操作

    对于数据插入操作,map 提供了多种方法。

    2.2.1 使用insert函数插入pair数据

    mapStudent.insert(pair(1, "zhao"));
    mapStudent.insert(pair(2, "qian"));
    mapStudent.insert(pair(3, "sun"));
    
    • 1
    • 2
    • 3

    2.2.2 使用数组方式插入数据

    mapStudent[1] = "zhao";
    mapStudent[2] = "qian";
    mapStudent[3] = "sun";
    
    • 1
    • 2
    • 3

    说明:上面的两种方法是有区别的,用 insert 函数插入数据,涉及到集合的唯一性这个概念,即当 map 中有这个关键字时,insert 操作是不能实现数据插入的;但是数组方式能够插入数据,插入的数据会覆盖该关键字之前对应的值。

    2.3 map中数据的遍历

    可以通过map 的迭代器 iterator、调用 map 对象的 begin() 和 end() 函数,实现对于 map 中数据的遍历,用法示例如下:

    // 遍历
    cout << "content of map as followed: " << endl;
    mapStudent_t::iterator iter;
    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
    ? ? cout << iter->first << " " << iter->second << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    说明:

    1)begin() 和 end() 两个成员函数,分别对应map 对象中第一个数据条目和最后一个数据条目,这两个数据条目的类型是 iterator;

    2)通过 map 对象的方法获取的 iterator 数据类型是一个 std::pair 对象,iterator 数据类型包括下面两个数据:

    • iterator->first:关键字(key)
    • iterator->second:存储的数据(value)

    2.4 map中数据的查找

    可以通过使用 map 的迭代器 iterator、调用 find 函数(传入的参数为要查找的 key),来查找定位 map 中的指定数据,用法示例如下:

    // 查找
    iter = mapStudent.find(2);
    if (iter != mapStudent.end())
    {
        cout << "Find it, the relative value is: " << iter->second << endl;
    }
    else
    {
        cout << "Can not find the relative value." << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    说明:find 函数的入参为 map 结构的 key,并且入参必须完全匹配map 的 key,才能找到对应的 value。例如,对于以下 map 结构:

    mapStudent.insert(pair("zhao", "zhaoyun"));
    
    • 1

    如果要查找该 map 的 value,必须在 find 函数中输入完整的 key (即“zhao”)作为入参才行,如果输入的入参为“zh”、或“zha”,都不能找到该 map 的 value。

    2.5 map中数据的删除

    对于 map 中数据的删除操作,可以分为如下两种情况:

    a)如果想要清空 map 中的所有数据,可以使用 clear 函数;

    b)如果想要删除 map 中的指定数据,可以通过使用 map 的迭代器 iterator、调用 erase 函数来实现,用法示例如下:

    // 删除
    iter = mapStudent.find(3);
    mapStudent.erase(iter);
    
    • 1
    • 2
    • 3

    2.6 map中数据的排序

    map 中的所有元素都会根据元素的键值,自动进行升序排序。

    3示例程序

    3.1 示例程序1

    此处展示一个输出 map 结构内容的示例代码。代码(map_test1.cpp)内容如下:

    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        // 结构的map
        typedef std::map mapStudent_t;
        mapStudent_t mapStudent;
    
        mapStudent.insert(pair(1, "zhao"));
        mapStudent.insert(pair(2, "qian"));
        mapStudent.insert(pair(3, "sun"));
    
        // map简单的输出方法
        cout << "mapStudent[1] is: " << mapStudent[1] << endl;
        cout << "mapStudent[3] is: " << mapStudent[3] << endl;
    
        // 结构的map
        typedef std::map mapRole_t;
        mapRole_t mapRole;
    
        mapRole.insert(pair("mage", "alliance"));
        mapRole.insert(pair("paladin", "alliance"));
        mapRole.insert(pair("warlock", "Horde"));
    
        // map简单的输出方法
        cout << "mapRole["mage"] is: " << mapRole["mage"] << endl;
        cout << "mapRole["warlock"] is: " << mapRole["warlock"] << endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    编译并执行上述代码,结果如下:

    3.2 示例程序2

    示例代码(map_test2.cpp)内容如下:

    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
    ? ? typedef std::map mapStudent_t;
    ? ? mapStudent_t mapStudent;
    
    ? ? mapStudent.insert(pair(1, "zhao"));
    ? ? mapStudent.insert(pair(2, "qian"));
    ? ? mapStudent.insert(pair(3, "sun"));
    
    ? ? // 遍历
    ? ? cout << "content of map as followed: " << endl;
    ? ? mapStudent_t::iterator iter;
    ? ? for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    ? ? {
    ? ? ? ? cout << iter->first << " " << iter->second << endl;
    ? ? }
    
    ? ? // 查找
    ? ? iter = mapStudent.find(2);
    ? ? if (iter != mapStudent.end())
    ? ? {
    ? ? ? ? cout << "Find it, the relative value is: " << iter->second << endl;
    ? ? }
    ? ? else
    ? ? {
    ? ? ? ? cout << "Can not find the relative value." << endl;
    ? ? }
    
    ? ? // 删除
    ? ? iter = mapStudent.find(3);
    ? ? mapStudent.erase(iter);
    
    ? ? // 再次遍历,观察删除操作是否成功
    ? ? cout << "after delete, content of map as followed: " << endl;
    ? ? for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    ? ? {
    ? ? ? ? cout << iter->first << " " << iter->second << endl;
    ? ? }
    ? ??
    ? ? return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    上述代码运行结果如下:

  • 相关阅读:
    kali中文输入法
    字体的基础知识:英文字体区分练习
    HCIP实验(05)OSPF综合实验
    智能恒等于推荐系统
    Rust泛型与trait特性,模仿接口的实现
    TouchGFX界面开发 | 按钮控件应用示例
    Redis未授权访问漏洞
    基于Java+vue前后端分离高校社团管理系统设计实现(源码+lw+部署文档+讲解等)
    java-php-python+nodejs+vue生物遗传病的治疗和防范系统
    【运维篇】三、SLF4J与Logback
  • 原文地址:https://blog.csdn.net/web13618542420/article/details/126516655