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

文章目录

  • 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.rhkb.cn/news/137916.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue路由与node.js环境搭建

目录 前言 一.Vue路由 1.什么是spa 1.1简介 1.2 spa的特点 1.3 spa的优势以及未来的挑战 2.路由的使用 2.1 导入JS依赖 2.2 定义两个组件 2.3 定义组件与路径对应关系 2.4 通过路由关系获取路由对象 2.5 将对象挂载到vue实例中 2.6 定义触发路由事件的按钮 2.7 定…

JavaScript小案例-tab栏切换(可移除item)

gif效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>tab栏切…

看完100%会写毕业论文

写论文是每个学术研究者都要面对的任务之一&#xff0c;在开始写论文之前&#xff0c;准备工作是至关重要的。本文将介绍一些写论文准备工作的重要步骤&#xff0c;并且探讨如何利用AI写作大师辅助来提高写作效率和质量&#xff0c;让你看完100%会写毕业论文。 01 — 了解论文…

键盘失灵按什么键恢复?详细方法分享!

“我的电脑键盘莫名其妙失灵了&#xff0c;试了好多方法都无法恢复。请问遇到键盘失灵的情况&#xff0c;应该按什么键才能恢复呢&#xff1f;” 键盘是计算机的重要输入设备之一&#xff0c;但有时候它可能会出现失灵的情况&#xff0c;让用户感到困惑和不知所措。但其实&…

【实战案例】技术转项目经理容易踩的坑,我都踩了

“带团队容易&#xff0c;带好团队难。” 这是身边一位项目经理近期在团队管理方面的深刻感悟。目前&#xff0c;他手上的一个项目被迫暂停了&#xff0c;项目团队也散了。下面给大家简要分享下这个项目案例。 【案例分享】 小李负责的是一个二次开发的项目&#xff0c;所涉及…

导览软件定制开发方案

随着智能手机的普及和人们对文化、旅游等方面的需求不断增加&#xff0c;导览软件市场前景广阔。本文将围绕导览软件定制开发方案展开&#xff0c;包括以下部分&#xff1a; 一、行业现状及市场需求 导览软件市场发展迅速&#xff0c;各类导览软件层出不穷。通过对市场…

alist windows 命令行版本下载、使用

下载 下载地址 https://github.com/alist-org/alist/releases 文件下载链接 &#xff0c;直接点击就能下载https://github.com/alist-org/alist/releases/download/v3.27.0/alist-windows-arm64.zip 安装 输入cmd&#xff0c;按enter键&#xff0c;会调出cmd命令行 输入 alis…

数组扁平化的方法

什么是“数组扁平化” 用简单的话来说&#xff0c;就是将一个多维数组变为一个一维数组。例如&#xff0c;将数组[1, 2, [3, [4, 5]], [6, 7]]扁平化处理后输出[1, 2, 3, 4, 5, 6, 7]。 实现“数组扁平化”方法 方式1&#xff1a;使用基础的递归遍历 声明一个函数&#xff0c…

《Linux操作系统实战》| 面试了两个实习生,Linux 基本命令都不会(一)

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

python进程和线程(05)

python进程和线程(05) 文章目录 python进程和线程(05)1 python进程和线程1.1 进程和线程概念1.2 并行执行1.3 核心使用语法_threading模块1.4 多线程编程1.4.1 案例单线程不能满足情况如下&#xff1a;1.4.2 多线程1.4.2.1 多线程创建语句1.4.2.2 案例 1.4.2 多线程传参使用1.4…

基于微信小程序的小区服务管理系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…

【数据库系统概论】数据库的四个基本概念:数据、数据库、数据库管理系统和数据库系统

数据&#xff08;data&#xff09;数据库&#xff08;DataBase, DB&#xff09;数据库管理系统&#xff08;DataBase Management System, DBMS&#xff09;数据库系统&#xff08;DataBase System, DBS&#xff09;感谢 &#x1f496; 数据&#xff08;data&#xff09; 定义&…

JavaScript小案例-树形菜单(菜单数据为数组)

菜单层级理论上可以无限多&#xff0c;因为是递归渲染。 gif演示图&#xff1a; 代码&#xff1a; 树形菜单.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&quo…

spring boot项目一次性能测试的总结

满足标准&#xff1a;并发大于等于100 &#xff0c;平均响应时间小于等于3秒 项目在压测过程中并发数只有50&#xff0c;在并发数100的情况下有很多请求链接是失败的 我们该如何入手去处理这些问题并提高并发数呢&#xff1f; 1、首先从压测结果入手&#xff0c;对不满足标准…

7.algorithm2e中while怎么使用

algorithm2e中while怎么使用 在 algorithm2e 宏包中&#xff0c;要使用 while 循环&#xff0c;您可以使用 \While 和 \EndWhile 命令来定义循环的开始和结束。以下是如何使用 while 循环的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorit…

GMAC PHY介绍

1.1PHY接口发展 &#xff08;1&#xff09;MII支持10M/100Mbps&#xff0c;一个接口由14根线组成&#xff0c;它的支持还是比较灵活的&#xff0c;但是有一个缺点是因为它一个端口用的信号线太多。参考芯片&#xff1a;DP83848 、DM900A&#xff08;该芯片内部集成了MAC和PHY接…

nginx配置gzip压缩,优化传输效率,加快页面访问速度

文章目录 引言一、什么是nginx的gzip二、nginx的常用配置项三、使用示例四、浏览器查看gzip是否生效1. 判断浏览器是否支持gzip2. 判断gzip是否生效 总结 引言 在现代互联网的高速发展进程中&#xff0c;网站的访问速度愈发成为了用户选择和留存的关键。其中&#xff0c;通过g…

python小程序 图书馆图书借阅借还管理系统 mbc21

为设计一个安全便捷&#xff0c;并且使借阅者更好获取本图书借还信息&#xff0c;本文主要有安全、简洁为理念&#xff0c;实现借阅者快捷寻找图书借还信息&#xff0c;从而解决图书借还信息复杂难辨的问题。该系统以django架构技术为基础&#xff0c;采用python语言和MySQL数据…

如何从外网远程控制企业内网电脑?

在企业中&#xff0c;保护公司机密和数据安全是至关重要的。为了确保员工在使用公司电脑时遵守相关规定&#xff0c;许多公司会采取外网监控员工电脑的方法。本文将介绍一些真实有效的方法和具体的操作步骤&#xff0c;以帮助您更好地监控员工电脑。 一、什么是外网监控&#x…