首页 > 其他分享 >关联容器笔记

关联容器笔记

时间:2024-11-03 18:52:08浏览次数:4  
标签:std 容器 cout 元素 无序 笔记 关联 键值

关联容器总结

有序关联容器

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

底层数据结构
  • 使用平衡树,比如(红黑树
  • 增删查的平均时间复杂度接近 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会调用构造函数原地构造对象

标签:std,容器,cout,元素,无序,笔记,关联,键值
From: https://blog.csdn.net/weixin_43459437/article/details/143468922

相关文章

  • 大数据学习笔记 第4天 Shell编程基础高级实战详解
    Shell一、Shell编程概述Shell本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。用户通过Shell来使用Linux,不启动Shell的话,用户就没办法使用Linux。在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(commandinterpr......
  • MySQL学习笔记(基础语法)
    目录前言什么是MySQL数据库介绍1.关系型数据库2.开源3.跨平台支持4.性能与可扩展性5.存储引擎6.安全性7.社区与支持8.应用场景9.兼容性10.工具与接口MySQL基础语法增(INSERT)改(UPDATE)删(DELETE)查(SELECT)前言昨天忘写了,今天补更两篇,一个MySQL数据......
  • c++模块(附加5篇笔记,看完点个赞)
    C++ 模板模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 ve......
  • 顺序容器对比
    顺序容器vector特点动态数组内存是连续的以二倍大小进行扩容,其中reserve只进行空间的预留不创建元素而resize既修改空间大小又改变元素个数deque的特点底层为二维动态数组第二维数组空间大小固定扩容时,第一维数组的二倍进行扩容该二维数组的内存并不是连续的list的特点......
  • C++ STL常用容器之set
    文章目录一、集合set二、所需的头文件三、基本访问操作3.1插入元素3.2删除元素3.3查找元素3.4其他函数四、无序集合unordered_set五、multiset六、unordered_multiset七、使用set容器八、map与set的区别一、集合setset称为集合,是一个内部自动有序且不含重复元素......
  • 【笔记/模板】Johnson全源最短路
    模板题目www.luogu.com.cn//Problem:P5905【模板】全源最短路(Johnson)//Contest:Luogu//URL:https://www.luogu.com.cn/problem/P5905//MemoryLimit:128MB//TimeLimit:1000ms////PoweredbyCPEditor(https://cpeditor.org)#include<bits/stdc++.h>......
  • 【笔记/模板】KMP 与 Z 函数
    前缀函数前缀函数通常称为border,一个字符串\(S\)的border定义为它的一个前缀子串\(t(t\neS)\),满足\(t\)既是\(S\)的前缀,也是\(S\)的后缀。下文的border均为\(S\)的最长border长度。简单来说,对于一个字符串\(S=\texttt{abcabcd}\)(下标从\(1\)开始),它的前......
  • 【笔记】动态规划
    前言动态规划(DynamicProgramming)是c++算法学习当中十分重要而变化灵活的一部分分支,这种算法是通过递推的方式从而达到求出最优解的目的。动态规划基本原理能用动态规划解决的问题,需要满足三个条件:最优子结构,无后效性和子问题重叠。最优子结构:每个子问题的解是其本身的最优......
  • 【笔记/模板】A*算法
    A*算法定义A*搜索算法(\(\text{A*searchalgorithm}\))是一种在图形平面上,对于有多个节点的路径求出最低通过成本的算法。它属于图遍历(英文:\(\text{Graphtraversal}\))和最佳优先搜索算法(英文:\(\text{Best-firstsearch}\)),亦是BFS的优化,用到了启发式搜索的思维。启发式搜索(......