当前位置: 首页 > article >正文

C++ Map与Set:数据的吟游诗——双城记

       在编程的世界里,数据结构如同一位位吟游诗人,诉说着信息的流转与变换。C++中的mapset便是这场诗歌盛宴中的两位主角,各自演绎着不同的篇章。它们虽然有着各自鲜明的特点,但也因其共通的优雅与高效,在开发中交相辉映。今天,我们就来聊一聊这两位“数据吟游诗人”的双城记。

1. Map与Set的相似之处:双生花

       首先,我们来看看mapset的相似之处。它们都源自C++标准库中的关联容器,也就是被设计来存储键值对或唯一元素的容器。

       mapset的底层实现通常是通过平衡二叉搜索树(如红黑树),因此它们都具备对数时间复杂度的查询、插入和删除操作(O(log n))。这一点,使得它们在处理大规模数据时,比普通的线性容器如vectorlist更加高效。

       它们的主要区别就在于:

  • Map:存储的是键值对,每个键与一个值相对应,可以通过键来访问对应的值。
  • Set:只存储键(唯一元素),没有值的概念,元素的唯一性由容器本身保证。

       但是,不论是map还是set,它们都提供了按顺序遍历元素的能力。换句话说,它们都是有序容器,存储的元素总是按照一定的顺序排列,这种顺序通常是基于元素的键值大小进行排序。

2. Map:与时间赛跑的钥匙

       想象一下,在一个庞大的信息体系中,map就像是一位掌握着“钥匙”的守门员。每个“钥匙”对应着一个“门”,这个门背后是一个与之匹配的“值”。

       map容器允许你在高效的时间内,通过指定的键(Key)迅速找到对应的值(Value)。它通过键值对的形式将信息存储,使得我们能在巨大的数据量中,快速定位某个值,恍如指尖轻轻一划,所有信息随之而至。

#include <iostream>
#include <map>

int main() {
    std::map<int, std::string> map_example;
    map_example[1] = "One";
    map_example[2] = "Two";
    map_example[3] = "Three";

    for (const auto& pair : map_example) {
        std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
    }

    return 0;
}

       如上所示,map通过键来访问和管理值。无论我们需要查找哪个元素,它都能在O(log n)的时间复杂度内快速定位。就像一个经验丰富的图书管理员,准确无误地将你引导到你想要的书架前。

3. Set:无声的守望者

       与map的喧嚣不同,set更像是一位默默守护的诗人,悄无声息地保管着唯一的元素。没有了键与值的繁杂,它只关心元素本身的存在。set通过平衡二叉树来保证元素的唯一性和有序性,任何重复的元素都不会被插入。这种特性,让它在去重、查找某个元素是否存在等操作中,表现得尤为高效。

#include <iostream>
#include <set>

int main() {
    std::set<int> set_example;
    set_example.insert(10);
    set_example.insert(20);
    set_example.insert(30);
    set_example.insert(20);  // Duplicate, will not be added

    for (const auto& elem : set_example) {
        std::cout << "Element: " << elem << std::endl;
    }

    return 0;
}

       在上面的代码中,尽管我们尝试插入了一个重复的元素(20),set自动地忽略了这个操作,确保了集合中元素的唯一性。它的“守望”方式,往往更加简洁、安静,却又充满力量。

4. Map与Set:一场无声的对话

       尽管mapset看似各自为政,它们的对话却充满了趣味与共鸣。在某些场景下,我们甚至可以将它们结合起来,发挥更大的作用。比如,利用map存储键值对,并通过set来追踪某些唯一值的出现频率,或通过map的键进行某种形式的分组。

#include <iostream>
#include <map>
#include <set>

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

    // 插入数据
    map_set_example["apple"].insert(1);
    map_set_example["apple"].insert(2);
    map_set_example["banana"].insert(1);

    // 输出数据
    for (const auto& pair : map_set_example) {
        std::cout << "Fruit: " << pair.first << ", Numbers: ";
        for (const auto& num : pair.second) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

       在这段代码中,我们用map来存储每种水果的名字,并且通过set来记录对应的数字。通过这种组合方式,我们不仅保留了水果名字与数字的映射关系,还确保了每个水果数字的唯一性。

5. 结语:数据的吟游诗篇

       mapset作为C++中的经典容器,它们在数据存储与查找上的高效性,已然成为现代程序设计中不可或缺的一部分。它们的设计理念,赋予了我们在复杂数据处理中更多的自由与便捷。在未来的编程旅程中,作为开发者的我们,依然会不断在这些高效工具的指引下,探索更为深邃的编程艺术。

       让我们随着mapset这两位“吟游诗人”共同前行,在数据的海洋中航行,书写属于我们的代码诗篇。


http://www.kler.cn/a/454022.html

相关文章:

  • Vite内网ip访问,两种配置方式和修改端口号教程
  • vue之axios基本使用
  • 单例模式懒汉式、饿汉式(线程安全)
  • 『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释
  • 梳理你的思路(从OOP到架构设计)_设计模式Android + Composite模式
  • 使用FFmpeg进行拉流和推流操作
  • MySql详细教程-从入门到进阶(超实用)
  • 【Vue】前端使用node.js对数据库直接进行CRUD操作
  • 21、电科院FTU检测标准学习笔记-电磁兼容
  • pycharmGateway远程开发0.5GB of free space is necessary to run the IDE
  • postgresql安装部署(linux)
  • 一文理解机器学习中二分类任务的评价指标 AUPRC 和 AUROC
  • 单机游戏《野狗子》游戏运行时提示dbghelp.dll缺失是什么原因?dbghelp.dll缺失要怎么解决?
  • 0基础跟德姆(dom)一起学AI 自然语言处理05-文本特征处理
  • Github——网页版上传文件夹
  • 最新版本 - 二进制安装k8s1.29.2 集群
  • Python 图片压缩工具
  • 初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP
  • 【踩坑/Linux】Vmware中的Ubuntu虚拟机无法访问互联网
  • Linux高级--3.3.2.6高并发编程之“内存屏障”“CPU屏障”“编译屏障”
  • 3350、检测相邻递增子数组 Ⅱ
  • 中科岩创桥梁自动化监测解决方案
  • 对gPTP上PTP安全控制的评估
  • Tengine平替Nginx
  • 代码随想录day27 贪心1
  • 使用 Python 操作 Excel 表格