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

2023-10-27

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以前的元素,反之亦然
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • sql计算留存率

    文章目录 什么是留存率 案例1 案例2 案例3 案例4 参考 什么是留存率 留存用户是指用户在APP产生行为后 在固定的第N日继续访问或使用APP的用户 留存率是指用户在一段时间后或固定的间隔后产生留存用户的比例 用户留存率有很多种 新客留
  • 查看Linux服务器内存情况

    查看Linux服务器内存情况 一 free命令 二 top命令 总结 一 free命令 free命令用于显示内存的使用情况 包括实体内存 虚拟的交换文件内存 共享内存区段 以及系统核心使用的缓冲区等 语法 free bkmotV s lt
  • Redis 三台服务器搭建三主三从详细步骤

    1 需要三台服务器 如 服务器A B C 2 在三台服务器上安装gcc 执行如下命令 yum install gcc 3 验证是否安装好gcc gcc v 如果出现如下信息 代表已安装好 如果防火墙是开启状态 需要防火墙开通端口 永久开放如
  • CVPR 2023

    论文题目 Accelerated Coordinate Encoding Learning to Relocalize in Minutes using RGB and Poses 在公众号 3D视觉工坊 后台回复 原论文 可获取对应论文p
  • 血压计算法

    1 1 动脉平均压的计算 动脉平均压 MAP 是血压波 P t 形在一个周期内的积分除以周期T 其定义如下 均压反映了动脉血压的数值和波形 从试波法原理的两条基本原则 振荡波包络线呈现出近似抛物线的形态 脉搏振荡波振幅最大对应的袖带压力为平
  • 109,有序链表转换为二叉搜索树

    给定一个单链表 其中的元素按升序排序 将其转换为高度平衡的二叉搜索树 本题中 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 示例 给定的有序链表 10 3 0 5 9 一个可能的答案是 0 3 9 10
  • css 小记

    新的 CSS 伪类函数 is 和 where is 旧的写法 h1 gt b h2 gt b h3 gt b h4 gt b h5 gt b h6 gt b color hotpink 新的写法 伪类 is is h1 h2 h3 h4 h
  • RSA算法多种生成公私钥的方式

    前言 在实际项目开发中常常需要用到非对称性加密算法生成公私钥应用于加密与认证 服务器间ssh免密等 关于非对称性加密算法生成公私钥等笔者之前有发表过一篇有趣的文章 感兴趣的朋友可以去了解下 生成公私钥的方式有很多 本文以RSA算法为例来讨论
  • 基于Matlab的跨孔CT胖射线追踪算法(二)

    基于Matlab的跨孔CT胖射线追踪算法 二 CT技术是一种无损的工程物探检测技术 因其方法简单 分辨率高 理论上更可靠 结果更直观 被广泛的应用于各种工程 胖射线追踪是CT技术的一种正演算法 本文的代码和示意图 供学习借鉴 1 文章目录
  • Java——JavaDoc生成文档

    JavaDoc javadoc命令是用来生成自己的APi文档 参数信息 author 作者名 version 版本号 since 致命需要最早使用的jdk版本 param 参数名 return 返回值情况 throws 异常抛出情况 用一段
  • pyecharts折线图上symbol(小圆圈)颜色的修改方法

    本人刚接触pyecharts 尝试做k线与指标图 但遇到不少困难 虽然pyecharts虽在展现上令人舒畅 但使用起来并不能像echarts那么完善 比如k线的颜色目前就改不了 我是在尝试了各种方法后 才在GitHub上找到了作者的回答 此
  • 截图 识别指定位置文字

    def tu browser get screenshot as file 1 png img Image open 1 png bo 图片左边到元素左边的距离 图片上面到元素上边的距离 图片左边到元素最右边的距离 图片上面到元素最下边的距
  • Keras—embedding嵌入层的使用

    最近在工作中进行了NLP的内容 使用的还是Keras中embedding的词嵌入来做的 Keras中embedding层做一下介绍 中文文档地址 https keras io zh layers embeddings 参数如下 其中参数重点
  • Flask 物联网局部应用情景

    实践 Raspberry Pi 托管 Flask 网络服务器控制设备 云托管 Flask 和 SQLite 网络服务器使用Web API 处理 ESP8266 数据 Raspberry Pi 托管 Flask 网络服务器使用SQLite存储
  • ChatGPT有哪些作用?

    ChatGPT有哪些作用 介绍 在当今信息技术飞速发展的时代 自然语言处理和人工智能已经成为许多领域的关键技术 ChatGPT是一种先进的语言生成模型 通过人工智能技术为用户提供了许多有用的功能和应用 本文将探讨ChatGPT的作用及其在不
  • 【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 在上一篇文章中
  • 【浅学Java】Servlet详解

    Servlet详解 1 什么是Servlet 2 创建一个Servlet程序 1 创建项目 Maven 2 引入依赖 3 创建一些新目录 4 编写代码 5 打包 6 部署 7 验证程序 3 简化创建Servlet的步骤 1 安装plugin
  • .NET Desktop程序员:互联网大环境下软件生产力的创造者

    目录 引言 桌面软件如何适配今天的互联网 让 NET桌面软件工程拥有互联网基因 WebRuntime是什么 具体案例 让应用适配不同的应用场景 基于应用的Web页面 Cloud WinForm 强大的Web生产力 总结 引言 对每个 NET
  • 征服数据宇宙,新华三存储护卫队早有准备?

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

    文章目录 1 unordered map的介绍 2 unordered map的使用 2 1unordered map的构造函数 2 2unordered map的迭代器 2 3unordered map的容量和访问函数 2 4unorde