C++ hash—unordered_mapset

目录

一. unordered系列关联式容器

1、文档说明

2、接口说明

1. 构造

2. 容量

3. 迭代器

4. 元素访问

5. 查询

6. 修改

7. 桶操作

8. 测试

二、unordered_set

1、​​​​​​​文档说明 

2、接口说明

1. 构造

2. 容量

3. 迭代器

4. 元素访问

5. 插入和删除操作

6. 桶操作

7. 哈希策略

8. 测试 


一. unordered系列关联式容器

在C++98中,STL提供了一系列底层为红黑树结构的关联式容器。这些容器在查询时的效率可达到log2N,即最差情况下需要比较红黑树的高度次数。然而,当树中的节点非常多时,查询效率也不理想。为了提供更高效的查询,C++11引入了4个unordered系列的关联式容器。这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。

1、文档说明

  • unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的value。
  • 在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
  • 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
  • 与map相比,unordered_map在通过key访问单个元素时更快,但在遍历元素子集的范围迭代方面效率较低。
  • unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value。
  • 它的迭代器至少是前向迭代器。

2、接口说明

1. 构造

函数声明

功能介绍

unordered_map

构造不同格式的unordered_map对象

2. 容量

函数声明

功能介绍

bool empty() const

检测unordered_map是否为空

size_t size() const

获取unordered_map的有效元素个数

3. 迭代器

函数声明

功能介绍

begin

返回unordered_map第一个元素的迭代器

end

返回unordered_map最后一个元素下一个位置的迭代器

cbegin

返回unordered_map第一个元素的const迭代器

cend

返回unordered_map最后一个元素下一个位置的const迭代器

4. 元素访问

函数声明

功能介绍

operator[]

返回与key对应的value,没有一个默认值

注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶  中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中, 将key对应的value返回。

5. 查询

函数声明

功能介绍

iterator find(const K& key)

返回key在哈希桶中的位置

size_t count(const K& key)

返回哈希桶中关键码为key的键值对的个数

注意: unordered_map中key是不能重复的,因此count函数的返回值最大为1。

6. 修改

函数声明

功能介绍

insert

向容器中插入键值对

erase

删除容器中的键值对

void clear()

清空容器中有效元素个数

void swap(unordered_map&)

交换两个容器中的元素

7. 桶操作

函数声明

功能介绍

size_t bucket_count()const

    返回哈希桶中桶的总个数

size_t bucket_size(size_t n)const

返回n号桶中有效元素的总个数

size_t bucket(const K& key)

返回元素key所在的桶号

8. 测试

#include <iostream>
#include <unordered_map>

int main() {
    // 构造unordered_map对象
    std::unordered_map<int, std::string> myMap = { {1, "apple"}, {2, "banana"}, {3, "orange"} };

    // 容量操作
    bool isEmpty = myMap.empty();
    size_t size = myMap.size();

    std::cout << "Is empty? " << (isEmpty ? "Yes" : "No") << std::endl;
    std::cout << "Size: " << size << std::endl;

    // 迭代器操作
    auto it = myMap.begin();
    while (it != myMap.end()) {
        std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;
        ++it;
    }

    // 元素访问
    std::string value = myMap[2];
    std::cout << "Value at key 2: " << value << std::endl;

    // 查询操作
    auto findIt = myMap.find(3);
    if (findIt != myMap.end()) {
        std::cout << "Key 3 found. Value: " << findIt->second << std::endl;
    }

    size_t count = myMap.count(1);
    std::cout << "Number of elements with key 1: " << count << std::endl;

    // 修改操作
    myMap.insert({ 4, "grape" });
    myMap.erase(1);

    // 桶操作
    size_t bucketCount = myMap.bucket_count();
    size_t bucketSize = myMap.bucket_size(2);
    size_t keyBucket = myMap.bucket(3);

    std::cout << "Bucket count: " << bucketCount << std::endl;
    std::cout << "Bucket size at index 2: " << bucketSize << std::endl;
    std::cout << "Bucket of key 3: " << keyBucket << std::endl;

    return 0;
}

二、unordered_set

1、文档说明 

  • 无序集合unordered是存储没有特定顺序的唯一元素的容器,它允许基于它们的值快速检索单个元素。
  • 在unordered_set中,元素的值同时也是唯一标识它的键。键是不可变的,因此,在容器中不能修改unordered_set中的元素——但是可以插入和删除它们。
  • 在内部,unordered_set中的元素没有按照任何特定的顺序排序,而是根据它们的散列值组织到bucket中,以便通过它们的值直接快速访问单个元素(平均时间复杂度为常数)。
  • Unordered_set容器在按键访问单个元素时比set容器快,尽管它们在通过其元素子集进行范围迭代时通常效率较低。

2、接口说明

1. 构造

函数声明

功能介绍

unordered_set 

构造不同格式的unordered_set对象

2. 容量

函数声明

功能介绍

bool empty() const

检测unordered_set是否为空

size_t size() const

获取unordered_set的有效元素个数

3. 迭代器

函数声明

功能介绍

begin

返回unordered_set第一个元素的迭代器

end

返回unordered_set最后一个元素下一个位置的迭代器

cbegin

返回unordered_set第一个元素的const迭代器

cend

返回unordered_set最后一个元素下一个位置的const迭代器

4. 元素访问

函数声明

功能介绍

iterator find(const T& value)

返回值为value的元素的迭代器

size_t count(const T& value) 

返回值为value的元素在unordered_set中的个数

5. 插入和删除操作

函数声明功能介绍
pair<iterator, bool> insert(const T& value)向容器中插入元素value
iterator erase(iterator position) 删除迭代器position指向的元素
size_type erase(const T& value)删除值为value的元素的个数
void clear()清空容器中的所有元素

6. 桶操作

函数声明功能介绍
size_t bucket_count() const 返回unordered_set中桶的总个数
size_t bucket_size(size_t n) const返回第n个桶中的元素个数
size_t bucket(const T& value) const返回元素value所在的桶号

7. 哈希策略

函数声明功能介绍
float load_factor() const 返回当前的负载因子
float max_load_factor() const返回最大负载因子
void rehash(size_type count)重新分配内部存储空间,使桶的数量至少为count
void reserve(size_type count)设置容器的最小桶数,以容纳count个元素

8. 测试 

#include <iostream>
#include <unordered_set>

int main() {
    // 构造unordered_set对象
    std::unordered_set<int> mySet = { 1, 2, 3, 4, 5 };

    // 容量操作
    bool isEmpty = mySet.empty();
    size_t size = mySet.size();

    std::cout << "Is empty? " << (isEmpty ? "Yes" : "No") << std::endl;
    std::cout << "Size: " << size << std::endl;

    // 迭代器操作
    auto it = mySet.begin();
    while (it != mySet.end()) {
        std::cout << "Value: " << *it << std::endl;
        ++it;
    }

    // 元素访问
    auto findIt = mySet.find(3);
    if (findIt != mySet.end()) {
        std::cout << "Value 3 found." << std::endl;
    }

    size_t count = mySet.count(2);
    std::cout << "Number of elements with value 2: " << count << std::endl;

    // 插入和删除操作
    auto insertResult = mySet.insert(6);
    if (insertResult.second) {
        std::cout << "Insertion successful." << std::endl;
    }

    auto eraseIt = mySet.find(4);
    if (eraseIt != mySet.end()) {
        mySet.erase(eraseIt);
        std::cout << "Element erased." << std::endl;
    }

    mySet.clear();

    // 桶操作
    size_t bucketCount = mySet.bucket_count();
    size_t bucketSize = mySet.bucket_size(2);
    size_t valueBucket = mySet.bucket(5);

    std::cout << "Bucket count: " << bucketCount << std::endl;
    std::cout << "Bucket size at index 2: " << bucketSize << std::endl;
    std::cout << "Bucket of value 5: " << valueBucket << std::endl;

    // 哈希策略
    float loadFactor = mySet.load_factor();
    float maxLoadFactor = mySet.max_load_factor();

    std::cout << "Load factor: " << loadFactor << std::endl;
    std::cout << "Max load factor: " << maxLoadFactor << std::endl;

    mySet.rehash(10);
    mySet.reserve(20);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【脑电信号处理与特征提取】P7-贾会宾:基于EEG/MEG信号的大尺度脑功能网络分析

基于EEG/MEG信号的大尺度脑功能网络分析 Q: 什么是基于EEG/MEG信号的大尺度脑功能网络分析&#xff1f; A: 基于脑电图&#xff08;EEG&#xff09;或脑磁图&#xff08;MEG&#xff09;信号的大尺度脑功能网络分析是一种研究大脑活动的方法&#xff0c;旨在探索脑区之间的功能…

Win11系统连接带HDMI接口的显示器后,电脑没有声音如何调试

解决这个问题的方法很简单&#xff0c;没有那么复杂。之所以使用HDMI接口连接了显示器后没声音&#xff0c;原因就是HDMI接口是包含音频视频两种信号的接口。当电脑的HDMI接口被使用时&#xff0c;系统就会默认从HDMI设备输出声音信号了&#xff0c;而此时如果HDMI设备没有声音…

vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍

vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍 提示&#xff1a;以下是本篇文章正文内容&#xff0c;写文章实属不易&#xff0c;希望能帮助到各位&#xff0c;转载请附上链接。 vivado实现电路用到的资源类型 LUT&#xff08;Look-Up Table&#xff09;&am…

文心一言APP上线新功能,一张照片、三句话即可生成专属数字分身

只需一张照片、录制三句话&#xff0c;就能拥有一个自己的数字分身&#xff1f;这不是科幻电影&#xff0c;而是文心一言APP上线的新功能 - 数字分身。 目前&#xff0c;文心一言APP正在内测数字分身新功能&#xff0c;明天起&#xff0c;iOS和Android用户升级新版本后&#xf…

给定长度为n的递增数组a,进行n - 1次操作:求当前a数组的差分数组,然后使a为差分数组,继续进行操作。求最后数组的元素是什么

题目 思路: #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; #define pb push_back #define lson p << 1 #define rson p << 1 | 1 #define fi first #define se second const int maxn = 1e6 + 5, maxm = 5e…

java之基础知识、零碎知识

MENU java学习路程之篇一、知识点、path环境变量、计算机发展史、数据的存储和运算、人机交互、计算机语言java学习路程之篇二、知识点、JAVA背景介绍、配置JAVA_HOME、跨平台、JVM、JRE、JDKjava学习路程之篇三、知识点、类、模块、项目、操作、下载、安装、IDEA、开发工具jav…

Vue-49、Vue技术实现动画效果

1、首先&#xff0c;在Vue项目中的src/components文件夹下创建一个名为AnimatedBox.vue的文件。 2、编辑AnimatedBox.vue文件&#xff0c;添加以下代码&#xff1a; <template><div class"animated-box" click"toggle"><transition name&q…

Excel没有内置统计字数功能,但可以用一些变通的方法

是否需要计算Excel工作簿中某个单元格或单元格范围内的单词数? 出于多种原因,你可能需要计算文本数据中的字数。也许你有逗号分隔的列表,需要计算每个列表中的项目数。 不幸的是,Excel没有内置的单词计数方法。但是有一些聪明的方法可以得到你需要的结果。 这篇文章将向…

【Docker】【深度学习算法】在Docker中使用gunicorn启动多个并行算法服务,优化算法服务:从单进程到并行化

文章目录 优化算法服务&#xff1a;从单进程到并行化单个服务架构多并行服务架构Docker化并指定并行服务数量 扩展知识 优化算法服务&#xff1a;从单进程到并行化 在实际应用中&#xff0c;单个算法服务的并发能力可能无法满足需求。为了提高性能和并发处理能力&#xff0c;我…

OpenHarmony—开发及引用静态共享包(API 9)

HAR(Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。 接下来&a…

Matlab图像模拟加噪——高斯噪声、椒盐噪声、泊松噪声、乘性噪声、均匀噪声、指数噪声

1.高斯噪声 (1)通过均值和方差来产生 Jimnoise(I, gaussian, 0, 0.01);%高斯噪声&#xff0c;均值为0&#xff0c;方差为0.01(2)通过位置信息来产生 Iim2double(I); Vzeros(size(I)); %建立矩阵V for i1:size(V, 1)V(i,:)0.02*i/size(V,1); end Jimnoise(I, localvar, V); …

Android Jetpack Compose之底部导航栏的实现

目录 1.概述2. 效果展示3. 代码实现3.1 定义底部导航栏的tab项3.2 整体页面架构搭建3.3 底部导航栏的实现3.4 所有代码 4.总结 1.概述 写过一段Android jetpack compose 界面的小伙伴应该都用过Compose的脚手架Scaffold&#xff0c;利用它我们可以很快的实现一个现代APP的主流…

android开发---简单购物商城(JAVA) (一)

包括&#xff1a;商品展示&#xff0c;商品详情&#xff0c;购物车&#xff0c;删除&#xff0c;一键清除&#xff0c;返回 运用sqllist 另外因为一篇写不下 继续可看 源码二 下面是目录 运行样子 下面是源码 AndroidManifest.xml <?xml version"1.0" e…

路由重定向和别名

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 路由重定向实例场景&#xff1a;路由重定向的应用场景&#xff1a; 2. 路由别名实例场景&#xff1a;路由别名的应用场景&#xff1a; ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&…

(1)从 AGP 4.1.2 升级到 7.5.1 我遇到了什么问题

AGP 升级问题 &#xff08;1&#xff09;Could not get unknown property ‘project’ for settings&#xff0c;on project.buildscript 问题 Could not get unknown property ‘project’ for settings ‘AGP1’ of type org.gradle.initialization.DefaultSettings. agp4 …

数组与字符串深度巩固

经过再三思考觉得今天就写一篇关于数组与字符串相关的文章吧&#xff01;其中字符串主要通过练习来巩固知识亦或是获得新知识。好接下来将进行我们的学习时刻了。 首先我们来思考一个问题&#xff0c;你真的了解数组的数组名吗&#xff1f;数组名真的就单单一个名字而已吗&…

前置知识:方法递归

认识递归的形式 递归是一种算法&#xff0c;在程序设计语言中广泛应用。从形式上来说&#xff1a;方法调用自身的形式称为方法递归&#xff08;recursion&#xff09;。 递归的形式 直接递归&#xff1a;方法自己调用自己间接递归&#xff1a;方法调用其他方法&#xff0c;其…

深度解读NVMe计算存储协议-1

随着云计算、企业级应用以及物联网领域的飞速发展&#xff0c;当前的数据处理需求正以前所未有的规模增长&#xff0c;以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大&#xff0c;并对主机计算资源&#xff08;如内存和CPU&#xff09;造成极大负担&#xff0c;进…

ASP.NET Core+Layui使用EF Core操作MySQL实战

一、创建ASP.NET Core Web应用程序 注意&#xff0c;本章节主要以ASP.NET Core 3.1版本作为博客的示例实例模板&#xff01;&#xff08;当然你也可以使用当前最新的.NET版本进行实操&#xff09;。 二、添加EF Core NuGet包 若要在项目中使用EF Core操作MySQL数据库&#xff…

【昕宝爸爸小模块】日志系列之什么是分布式日志系统

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…