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

关联容器笔记

关联容器总结

有序关联容器

键值的顺序自动排序,键值必须支持 < 操作符

底层数据结构
  • 使用平衡树,比如(红黑树
  • 增删查的平均时间复杂度接近 O(log⁡n)
种类
  • std::set:集合,包含唯一的键元素。

  • std::multiset:多重集合,允许键重复。

  • std::map:映射,键值对(键唯一,值可以重复)。

  • std::multimap:多重映射,允许键重复的键值对。

无序关联容器

底层数据结构
  • 链式哈希
  • 增删查的平均时间复杂度接近O(1)
种类
  • std::unordered_set:无序集合,包含唯一的键元素。
  • std::unordered_multiset:无序多重集合,允许键重复。
  • std::unordered_map:无序映射,键唯一。
  • std::unordered_multimap:无序多重映射,允许键重复。

方法

  • 插入操作

    • insert():在容器中插入元素,返回一个迭代器和一个布尔值(表示插入是否成功)。对于无序容器,可以传入 hint 迭代器提升效率。

    • emplace():在容器中原地构造元素,避免不必要的复制或移动操作。

  • 删除操作

    • erase():根据键或迭代器删除元素。返回已删除元素的数量。
  • 查找操作

    • find():返回一个指向指定键的迭代器,若键不存在则返回 end()
#include <iostream>
#include <map>
#include <unordered_set>

int main() {
    // std::map 示例
    std::map<int, std::string> m;

    // 插入元素
    m.insert(std::make_pair(1, "one"));
    m.emplace(2, "two");
    m[3] = "three";  // 使用下标操作符插入或更新元素

    // 查找元素
    auto it = m.find(1);
    if (it != m.end()) {
        std::cout << "Key 1 found with value: " << it->second << std::endl;  // 输出 "one"
    }
    else {
        std::cout << "Key 1 not found" << std::endl;
    }

    // 删除元素
    m.erase(2);  // 删除键为 2 的元素
    std::cout << "After erase, size of map: " << m.size() << std::endl;

    // 遍历元素
    std::cout << "Elements in map:" << std::endl;
    for (const auto& kv : m) {
        std::cout << kv.first << " => " << kv.second << std::endl;
    }

    // std::unordered_set 示例
    std::unordered_set<int> uset = { 1, 2, 3 };

    // 插入元素
    uset.insert(4);

    // 查找元素
    if (uset.find(3) != uset.end()) {
        std::cout << "Found 3 in unordered_set" << std::endl;
    }
    else {
        std::cout << "3 not found in unordered_set" << std::endl;
    }

    // 删除元素
    uset.erase(1);  // 删除元素 1
    std::cout << "After erase, size of unordered_set: " << uset.size() << std::endl;

    // 遍历元素
    std::cout << "Elements in unordered_set:" << std::endl;
    for (const auto& elem : uset) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

注:vector中push_back与emplace_back的区别

  • push_back会调用拷贝构造函数
  • emplace_back会调用构造函数原地构造对象

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

相关文章:

  • Java环境下配置环境(jar包)并连接mysql数据库
  • Linux中断、软中断、MMU内存映射-深入理解
  • Centos8安装软件失败更换镜像源
  • 11.4工作笔记
  • git入门教程12:git命令与技巧
  • 银行金融知识竞赛活动策划方案
  • 【天线&空中农业】草莓果实检测系统源码&数据集全套:改进yolo11-HSFPN
  • 【华为HCIP实战课程31(完整版)】中间到中间系统协议IS-IS路由汇总详解,网络工程师
  • 使用ssh-key免密登录服务器或免密连接git代码仓库网站
  • ASAN ThreadSanitizer定位多线程(资源管理)
  • LabVIEW过程控制实验平台
  • Flutter InkWell组件去掉灰色遮罩
  • C#医学检验信息系统LIS源码,医院检验科信息管理系统源码
  • 编程八种语言谁是最受市场青睐的?
  • 【已解决】cra 配置路径别名 @ 后,出现 ts 报错:找不到模块“@/App”或其相应的类型声明。ts(2307)
  • 【jvm】Major GC
  • 基于SpringBoot的视频点播系统设计与实现
  • 【计算机基础——操作系统——Linux】
  • Cuebric:用AI重新定义3D创作的未来
  • 两道算法题
  • Unreal5从入门到精通之如何在VR中使用3DUI
  • 【SpringMVC】传递json,获取url参数,上传文件
  • Redis-结构化value对象的类型
  • GBDT算法Python代码实现
  • HTML5和CSS3 介绍
  • 加强版 第六节 图像轮廓几何属性分析