C++标准模板库(STL)-map介绍

C++标准库中的map是一种关联容器,它提供了键值对的映射关系。每个键值对中的键都是唯一的,通过键可以访问对应的值。

map基本操作

  1. 插入元素:

使用insert函数插入元素,该函数有两种形式:

cpp 复制代码
// 插入一个pair<const Key, T>对象
map<int, string> mp;
mp.insert(pair<int, string>(1, "one"));

// 插入多个pair<const Key, T>对象
map<int, string> mp;
mp.insert(make_pair(2, "two"));
mp.insert(make_pair(3, "three"));
  1. 删除元素:

使用erase函数删除元素,该函数有两种形式:

cpp 复制代码
// 删除键为key的元素
mp.erase(key);

// 删除指向位置pos的元素,pos指向的元素会被删除,并返回指向下一个元素的迭代器
auto it = mp.begin();
for(; it != mp.end(); ++it) {
    if(it->first == key) {
        it = mp.erase(it);
    }
}
  1. 查找元素:

使用find函数查找元素,该函数返回一个迭代器,指向找到的元素或指向容器的end位置。有三种形式:

cpp 复制代码
// 查找键为key的元素,返回指向该元素的迭代器,如果找不到返回end()
auto it = mp.find(key);
if(it != mp.end()) {
    // 找到了元素,使用*it访问该元素的值
    string value = it->second;
} else {
    // 没有找到元素
}

// 查找键值大于等于key的第一个元素,返回指向该元素的迭代器,如果找不到返回end()
auto it = mp.upper_bound(key);
if(it != mp.end()) {
    // 找到了元素,使用*it访问该元素的值
    string value = it->second;
} else {
    // 没有找到元素
}

// 查找键值小于等于key的第一个元素,返回指向该元素的迭代器,如果找不到返回end()
auto it = mp.lower_bound(key);
if(it != mp.end()) {
    // 找到了元素,使用*it访问该元素的值
    string value = it->second;
} else {
    // 没有找到元素
}

map特性

  1. 提供一个映射关系,元素以键值对(key-value)的形式存储,能够根据key快速查找value。
  2. map中的键值对以Entry类型的对象实例形式存在。
  3. 键(key)在map中不可重复,但值(value)可以。
  4. 每个键最多只能映射一个值。
  5. map接口提供了分别返回key值集合、value值集合以及Entry(键值对)集合的方法。
  6. map支持泛型,形式如:Map<Key, T>。
  7. map底层在jdk1.8之前主要是数组和链表组成,jdk1.8之后新增了红黑树的特性。
  8. map是线程不安全的,如果需要在线程中操作,可以使用ConcurrentHashMap来操作。

应用举例

cpp 复制代码
#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> ages;

    // 插入数据
    ages["Alice"] = 25;
    ages["Bob"] = 30;
    ages["Charlie"] = 35;

    // 删除数据
    ages.erase("Bob");

    // 查找数据
    std::string name = "Bob";
    if (ages.find(name) == ages.end()) {
        std::cout << name << " is not found in the map." << std::endl;
    } else {
        std::cout << name << " is " << ages[name] << " years old." << std::endl;
    }

    // 遍历数据
    for (const auto& pair : ages) {
        std::cout << pair.first << " is " << pair.second << " years old." << std::endl;
    }

    return 0;
}

这个例子中,我们首先创建了一个map对象ages,并向其中插入了三个键值对。然后,我们使用erase函数删除了键为"Bob"的键值对。接着,我们使用find函数查找关键字"Bob",如果找不到,则输出"Bob未找到",否则输出"Bob的年龄是xxx"。最后,我们使用循环遍历整个map,并输出每个人的名字和年龄。

相关推荐
双叶83636 分钟前
(51单片机)LCD展示动画(延时函数)(LLCD1602教程)
c语言·数据库·c++·单片机·嵌入式硬件·51单片机
愚润求学1 小时前
【数据结构】哈希表
数据结构·c++·笔记·散列表
倔强的石头1061 小时前
【C++指南】位运算知识详解
java·开发语言·c++
mozun20202 小时前
QT:Qt5 串口模块 (QSerialPort) 在 VS2015 中正确关闭串口避免被占用
开发语言·c++·qt·串口·串口调试·上位机软件
byte轻骑兵2 小时前
【C++ 类和数据抽象】static 类成员
开发语言·c++
努力学习的小廉2 小时前
【C++】 —— 笔试刷题day_24
开发语言·c++
刃神太酷啦2 小时前
堆和二叉树--数据结构初阶(3)(C/C++)
c语言·数据结构·c++·算法·leetcode·深度优先·宽度优先
用户jjbjjbk2 小时前
QT多线程以及事件循环
c++·qt
阳光_你好2 小时前
医学图像(DICOM数据)读取及显示(横断面、冠状面、矢状面、3D显示)为什么用ITK+VTK,单独用ITK或者VTK能实一样功能吗?
c++
啊阿狸不会拉杆3 小时前
数据结构-排序
java·c语言·数据结构·c++·python·算法·排序算法