【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数

news2024/11/19 22:52:27

文章目录

  • 1. unordered_map的介绍
  • 2. unordered_map的使用
    • 2.1unordered_map的构造函数
    • 2.2unordered_map的迭代器
    • 2.3unordered_map的容量和访问函数
    • 2.4unordered_map的增删查改函数

1. unordered_map的介绍

unordered_map的介绍

在这里插入图片描述

  (1)unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。

  (2)在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。

  (3)在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

  (4)unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。

  (5)unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问value。

  (6)它的迭代器至少是前向迭代器。

             

unordered_map和map的区别:

  (1)底层实现:map内部使用红黑树(一种自平衡二叉查找树)来实现,而unordered_map则使用哈希表来实现。因此,在map中,元素是按照键的大小进行有序排列的,而在unordered_map中,则不保证元素的顺序。

  (2)性能表现:当需要有序地遍历元素时,map的性能比unordered_map更好。 但是,当需要快速查找特定的元素时,unordered_map通常比map更快。原因在于,map在插入和删除操作时需要维护红黑树的平衡,而unordered_map则只需要计算哈希值并将元素放入相应的桶中即可。

  (3)用途:由于map可以保证元素的有序性,所以适合用于需要有序的情况下,例如按照键排序输出元素、寻找最小值/最大值等。而unordered_map则适合用于需要快速查找元素的情况下,例如查找是否存在某个键值对、统计某个值出现的次数等。

             

2. unordered_map的使用

2.1unordered_map的构造函数

在这里插入图片描述

  以下是几个unordered_map构造函数的例子:

  (1)默认构造函数:

unordered_map<int, string> mymap;

             

  (2)使用n个元素构造unordered_map:

unordered_map<int, string> mymap = {{1, "one"}, {2, "two"}, {3, "three"}};

             

  (3)使用给定的范围构造unordered_map:

vector<pair<int, string>> myVector = {{1, "one"}, {2, "two"}, {3, "three"}};  
unordered_map<int, string> mymap(myVector.begin(), myVector.end());

             

  (4)使用给定的哈希函数和相等比较函数构造unordered_map:

struct myHashFunction {  
    size_t operator()(const int& key) const {  
        return hash<int>()(key);  
    }  
};  
  
struct myEqualFunction {  
    bool operator()(const int& key1, const int& key2) const {  
        return key1 == key2;  
    }  
};  
  
unordered_map<int, string, myHashFunction, myEqualFunction> mymap;

             

2.2unordered_map的迭代器

在这里插入图片描述
在这里插入图片描述

             

函数声明功能介绍
begin返回unordered_map第一个元素的迭代器
end返回unordered_map最后一个元素下一个位置的迭代器
cbegin返回unordered_map第一个元素的const迭代器
cend返回unordered_map最后一个元素下一个位置的const迭代器

             

  以下是使用unordered_map迭代器的示例:

  (1)使用迭代器遍历unordered_map,从begin()到end()。在循环中,使用it->first和it->second分别访问键和值。

#include <iostream>  
#include <unordered_map>  
  
int main() {  
    std::unordered_map<int, std::string> mymap = {{1, "one"}, {2, "two"}, {3, "three"}};  
  
    // 使用迭代器遍历unordered_map  
    for (auto it = mymap.begin(); it != mymap.end(); ++it) {  
        std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;  
    }  
  
    return 0;  
}

//Key: 1, Value: one  
//Key: 2, Value: two  
//Key: 3, Value: three  

             

  (2)使用范围for循环遍历unordered_map,这种方式更加简洁。使用const auto& pair来捕获每个键值对,并使用pair.first和pair.second分别访问键和值。

#include <iostream>  
#include <unordered_map>  
  
int main() {  
    std::unordered_map<int, std::string> mymap = {{1, "one"}, {2, "two"}, {3, "three"}};  
  
    // 使用范围for循环遍历unordered_map  
    for (const auto& pair : mymap) {  
        std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;  
    } 
  
    return 0;  
}

//Key: 1, Value: one  
//Key: 2, Value: two  
//Key: 3, Value: three  

             

2.3unordered_map的容量和访问函数

函数声明功能介绍
bool empty() const检测unordered_map是否为空
size_t size() const获取unordered_map的有效元素个数
operator[]返回与key对应的value,没有一个默认值

             

下面是unordered_map中容量和访问函数的示例:

在这里插入图片描述

  (1)empty() 函数用于检查 unordered_map 是否为空,即是否不包含任何键值对。如果 unordered_map 为空,则返回 true;否则返回 false。

#include <iostream>  
#include <unordered_map>  
  
int main() {  
    std::unordered_map<int, std::string> myMap;  
      
    if (myMap.empty()) {  
        std::cout << "myMap is empty" << std::endl;  
    } else {  
        std::cout << "myMap is not empty" << std::endl;  
    }  
      
    myMap = {{1, "one"}, {2, "two"}, {3, "three"}};  
      
    if (myMap.empty()) {  
        std::cout << "myMap is empty" << std::endl;  
    } else {  
        std::cout << "myMap is not empty" << std::endl;  
    }  
      
    return 0;  
}

//myMap is empty  
//myMap is not empty

             

在这里插入图片描述

  (2)size() 函数返回 unordered_map 中存储的键值对的数量。

#include <iostream>  
#include <unordered_map>  
  
int main() {  
    std::unordered_map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}};  
      
    std::cout << "Size of myMap: " << myMap.size() << std::endl;  
      
    return 0;  
}

//Size of myMap: 3

             

在这里插入图片描述

  (3)operator[] 用于访问或修改指定键的值。如果键不存在,则会插入一个新的键值对,其中键为指定的键,值为该类型的默认值。

#include <iostream>  
#include <unordered_map>  
  
int main() {  
    std::unordered_map<std::string, int> my_map;  
  
    // 使用operator[]插入键值对  
    my_map["apple"] = 1;  
    my_map["banana"] = 2;  
  
    // 使用operator[]访问键值对  
    std::cout << "Apple: " << my_map["apple"] << std::endl;  
    std::cout << "Banana: " << my_map["banana"] << std::endl;  
  
    // 如果键不存在,operator[]将插入新的键值对,并赋予默认值  
    std::cout << "Orange: " << my_map["orange"] << std::endl;  
  
    return 0;  
}

//Apple: 1  
//Banana: 2  
//Orange: 0

             

2.4unordered_map的增删查改函数

函数声明功能介绍
iterator find(const K& key)返回key在哈希桶中的位置
size_t count(const K& key)返回哈希桶中关键码为key的键值对的个数
insert向容器中插入键值对
erase删除容器中的键值对
void clear()清空容器中有效元素个数
void swap(unordered_map&)交换两个容器中的元素

             

下面是unordered_map中增删查改函数的示例:

在这里插入图片描述

  (1)find方法用于查找具有指定键的元素。

std::unordered_map<Key, Value> my_map;  
// 插入一些元素...  
  
// 使用find方法查找具有指定键的元素  
auto it = my_map.find("key");  
  
if (it != my_map.end()) {  
    // 键存在于unordered_map中  
    std::cout << "Found key: " << it->first << ", value: " << it->second << std::endl;  
} else {  
    // 键不存在于unordered_map中  
    std::cout << "Key not found" << std::endl;  
}

             

在这里插入图片描述

  (2)count方法用于获取具有指定键的元素的数量。

std::unordered_map<Key, Value> my_map;  
// 插入一些元素...  
  
// 使用count方法获取具有指定键的元素数量  
size_t count = my_map.count("key");  
  
if (count > 0) {  
    std::cout << "Key found" << std::endl;  
} else {  
    std::cout << "Key not found" << std::endl;  
}

             
在这里插入图片描述
  (3)insert方法用于插入元素。

std::unordered_map<Key, Value> my_map;  
  
// 使用insert方法插入元素  
std::pair<std::unordered_map<Key, Value>::iterator, bool> result = my_map.insert({"key", "value"});  
  
if (result.second) {  
    // 插入成功  
    std::cout << "Inserted key: " << result.first->first << ", value: " << result.first->second << std::endl;  
} else {  
    // 插入失败(键已存在)  
    std::cout << "Key already exists" << std::endl;  
}

//Inserted key: key, value: value

             
在这里插入图片描述
  (4)erase方法用于删除元素。

std::unordered_map<Key, Value> my_map;  
// 插入一些元素...  
  
// 使用erase方法删除具有指定键的元素  
auto it = my_map.find("key");  
if (it != my_map.end()) {  
    my_map.erase(it);  
    std::cout << "Erased key: " << it->first << std::endl;  
} else {  
    std::cout << "Key not found" << std::endl;  
}

//Erased key: key

             

在这里插入图片描述
  (5)clear方法用于删除所有元素。

std::unordered_map<Key, Value> my_map;  
// 插入一些元素...  
  
// 使用clear方法删除所有元素  
my_map.clear();  
  
if (my_map.empty()) {  
    std::cout << "Map is empty" << std::endl;  
} else {  
    std::cout << "Map is not empty" << std::endl;  
}

//Map is empty

             

在这里插入图片描述
  (6)swap方法用于交换两个unordered_map对象的内容。

std::unordered_map<Key, Value> my_map1;  
// 插入一些元素到my_map1...  
  
std::unordered_map<Key, Value> my_map2;  
// 插入一些元素到my_map2...  
  
// 使用swap方法交换my_map1和my_map2的内容  
my_map1.swap(my_map2);  
  
// 现在my_map1包含my_map2以前的元素,反之亦然

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch(ES)简答了解

ES简介 Elasticsearch&#xff08;通常简称为ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;旨在处理各种类型的数据&#xff0c;包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的&#xff0c;但随着时间的推移&#xff0c;它已经演变成一个功能…

web系统安全设计原则

一、前言 近日&#xff0c;针对西工大网络被攻击&#xff0c;国家计算机病毒应急处理中心和360公司对一款名为“二次约会”的间谍软件进行了技术分析。分析报告显示&#xff0c;该软件是美国国家安全局&#xff08;NSA&#xff09;开发的网络间谍武器。当下&#xff0c;我们发现…

【骑行之旅】昆明草海湿地公园和海晏村的美丽邂逅

这是一个九月的星期六&#xff0c;在昆明的大观公园门口&#xff0c;我们集合了一群热爱骑行的骑友。今天&#xff0c;阳光明媚&#xff0c;天空湛蓝&#xff0c;一切都充满了活力。我们的旅程从这里开始&#xff0c;一路向西&#xff0c;向着下一站&#xff0c;美丽的草海湿地…

虚拟机用户切换及设置root权限的密码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

驱动开发,IO多路复用(select,poll,epoll三种实现方式的比较)

1.IO多路复用介绍 在使用单进程或单线程情况下&#xff0c;同时处理多个输入输出请求&#xff0c;需要用到IO多路复用&#xff1b;IO多路复用有select/poll/epoll三种实现方式&#xff1b;由于不需要创建新的进程和线程&#xff0c;减少了系统资源的开销&#xff0c;减少了上下…

从0到1搭建Halo博客系统教程

前期准备 云服务器&#xff0c;域名&#xff0c;命令工具&#xff08;这里使用是Mobaxterm&#xff09; 安装环境 宝塔面板 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec在命令工…

【计算机视觉】Image Generation Models算法介绍合集

文章目录 一、Diffusion二、Guided Language to Image Diffusion for Generation and Editing&#xff08;GLIDE&#xff09;三、classifier-guidance四、Blended Diffusion五、DALLE 2六、AltDiffusion七、Group Decreasing Network八、Make-A-Scene九、Iterative Inpainting十…

c++ - 抽象类 和 使用多态当中一些注意事项

抽象类 纯虚函数 在虚函数的后面写上 0 &#xff0c;则这个函数为纯虚函数。 class A { public:virtual void func() 0; }; 纯虚函数不需要写函数的定义&#xff0c;他有类似声明一样的结构。 抽象类概念 我们把具有纯虚函数的类&#xff0c;叫做抽象类。 所谓抽象就是&a…

docker gitlab+jenkins搭建

一&#xff1a;gitlab搭建: 1&#xff1a;docker部署 2&#xff1a;修改root密码 3&#xff1a;创建普通账户 4&#xff1a;设置sshken 二&#xff1a;jenkins搭建 配置脚本 bash -x /var/jenkins_home/shell/game01.sh

图解数据结构

&#x1f31e;欢迎来到数据结构的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2023年9月17日&…

【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)

阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…

性能测试-性能调优主要方向和原则(15)

性能调优主要方向明确性能瓶颈之后,就需要进行性能调优了,调优主要从图所示的多个方向入手。能优化手段并不一定是独立应用的,在一次优化过程中很可能应用了多种优化技巧。 硬件层面优化 硬件层面优化更偏向于监控,当定位到硬件资源成为瓶颈后,更多是采用扩容等手段来解决…

代码随想录算法训练营第三十六天| 435. 无重叠区间 763.划分字母区间 56. 合并区间

今天的三道题目&#xff0c;都算是 重叠区间 问题&#xff0c;大家可以好好感受一下。 都属于那种看起来好复杂&#xff0c;但一看贪心解法&#xff0c;惊呼&#xff1a;这么巧妙&#xff01; 还是属于那种&#xff0c;做过了也就会了&#xff0c;没做过就很难想出来。 不过大…

synchronized实战:synchronized 锁升级过程

下面程序通过对加锁前后Object对象字节码的打印验证了对象由无锁到偏向锁的过程。 public class T01 {public static void main(String[] args) {Object o new Object();System.out.println(ClassLayout.parseInstance(o).toPrintable());o.hashCode();System.out.println(Cl…

Linux界的老古董

Slackware 是由 Patrick Volkerding 制作的 Linux 发行版&#xff0c;从 1993 年发布至今也一直在 Patrick 带领下进行维护。7 月 17 日&#xff0c;Slackware 才刚刚过完它 24 岁的生日&#xff0c;看似年纪轻轻的它&#xff0c;已然是 Linux 最古老的发行版。 Slackware 的发…

laravel框架 - 安装初步使用学习 composer安装

一、什么是laravel框架 Laravel框架可以开发各种不同类型的项目&#xff0c;内容管理系统&#xff08;Content Management System&#xff0c;CMS&#xff09;是一种比较典型的项目&#xff0c;常见的网站类型&#xff08;如门户、新闻、博客、文章等&#xff09;都可以利用CM…

【Linux学习笔记】权限

1. 普通用户和root用户权限之间的切换2. 权限的三个w2.1. 什么是权限&#xff08;what&#xff09;2.1.1. 用户角色2.1.2. 文件属性 2.2. 怎么操作权限呢&#xff1f;&#xff08;how&#xff09;2.2.1. ugo-rwx方案2.2.2. 八进制方案2.2.3. 文件权限的初始模样2.2.4. 进入一个…

Linux基础操作

ls [-a -l -h] [Linux路径] 当不使用选项和参数&#xff0c;直接使用ls命令本体&#xff0c;表示以平铺的方式&#xff1a;列出当前工作目录下的内容 ls -a -a表示all的意思&#xff0c;即列出所有文件&#xff08;包含隐藏的文件和文件夹&#xff09; ls -l 以竖列的形式展示信…

linux C语言 socket的server、client 实现

讲解&#xff1a; 在Linux中&#xff0c;使用socket与另一端建立连接通常涉及到以下步骤&#xff1a; 1. 创建Socket&#xff1a;首先&#xff0c;你需要创建一个套接字(socket)。你可以使用socket()系统调用来创建套接字。通常&#xff0c;你需要指定套接字的类型&#xff0…

ssh服务登录原理与配置

文章目录 前言一、基于口令的认证&#xff08;用户名密码&#xff09;二、基于公钥的认证&#xff08;免密登录&#xff09;三、禁止用户登录和修改端口四、免密登录具体操作 前言 非对称加密是在认证用户连接的时候使用的&#xff0c;对称加密是在用户连接之后开始传输数据的…