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

关联容器笔记

关联容器总结

有序关联容器

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

底层数据结构
  • 使用平衡树,比如(红黑树
  • 增删查的平均时间复杂度接近 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);  // 删除元素 1std::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.lryc.cn/news/476465.html

相关文章:

  • 在阿里云快速启动Umami玩转网页分析
  • Linux练习作业
  • FFMPEG录屏(21)--- Linux 下基于X11枚举所有可见窗口,并获取标题、图标、缩略图、进程路径等信息
  • mybatis resultMap标签注意事项(pageHelper结合使用的坑)
  • 100种算法【Python版】第33篇——Tonelli-Shanks算法
  • 深度学习基础知识-全连接层
  • ffmpeg 提取mp4文件中的音频文件并保存
  • 【MySQL 保姆级教学】 复合查询--超级详细(10)
  • ONLYOFFICE:数字化办公的创新解决方案与高效协作平台
  • 编译Kernel时遇到“error: ‘linux/compiler_types.h‘ file not found“的解决方法
  • 开发之翼:划时代的原生鸿蒙应用市场开发者服务
  • 代码随想录一刷——1.两数之和
  • vue自定义组件实现v-model双向数据绑定
  • excel指定单元格输入相同的值,比如给D1~D10000输入现在的值
  • 中国最强乳企伊利,三个季度净赚超百亿
  • SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext
  • 配置elk插件安全访问elk前台页面
  • [操作系统作业]页面置换算法实现(C++)
  • 前端技术月刊-2024.11
  • 搜索引擎语法大全(Google、bing、baidu)
  • java设计模式之行为型模式(11种)
  • 微服务系列一:基础拆分实践
  • leetcode 1470.重新排列数组
  • windows在两台机器上测试 MySQL 集群实现实时备份
  • 点晴模切ERP系统助力模切企业转型升级之路
  • redis修改配置文件配置密码开启远程访问后台运行
  • 市场分化!汽车零部件「变天」
  • SCSS在Vue中的用法
  • CPU用户时间百分比
  • RN中的StyleSheet