C++ hash—unordered_mapset

news2024/11/15 21:31:39

目录

一. 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.coloradmin.cn/o/1423976.html

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

相关文章

AI赋能编程 | 自动化工具助力高效办公

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言泡泡AI工具卡片思维导图Markdown编辑器 其他工具文件免费处理工具结语 合集…

SpringBoot 使用WebSocket功能

实现步骤&#xff1a; 1.导入WebSocket坐标。 在pom.xml中增加依赖项&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>2.编写WebSocket配…

查看 npm的一些命令,以及npm config set registry x x x 不生效 解决方案

在 Mac 上查看自己的 npm 源&#xff0c;可以使用以下命令&#xff1a; 打开终端应用程序&#xff08;Terminal&#xff09;。 运行以下命令来查看当前的 npm 配置&#xff1a; npm config list这会显示 npm 的配置信息&#xff0c;包括当前使用的源&#xff08;registry&am…

FCIS 2023:洞悉网络安全新前沿,引领未来安全创新狂潮

在数字化浪潮席卷全球的今天&#xff0c;网络安全问题愈发凸显其重要性。 FCIS 2023网络安全创新大会作为业界瞩目的盛会&#xff0c;不仅汇聚了国际顶尖的网络安全专家&#xff0c;更展示了最前沿的安全技术与研究成果。那么&#xff0c;参与这场大会&#xff0c;我们究竟能学…

MySQL-DQL(Data Query Language)数据查询语言

文章目录 1. DQL定义2. 基础查询3. 条件查询&#xff08;WHERE&#xff09;4. 分组查询&#xff08;GROUP BY&#xff09;5. 过滤分组&#xff08;HAVING&#xff09;6. 排序&#xff08;ORDER BY&#xff09;7. 限制查询结果的条数&#xff08;LIMIT&#xff09;8. 多表查询8.…

OG Trade在ZKX揭幕:一家基于Starknet的游戏化永续合约交易所

ZKX的 OG Trade通过内置游戏化和30分钟交易竞赛&#xff0c;为所有交易者创造机会&#xff0c;革新了永续合约交易模式。 2024年1月30日 — ZKX宣布推出OG Trade&#xff0c;这是一家基于Starknet的游戏化永续合约交易所&#xff0c;旨在满足短期交易者、高水平交易者和波段交易…

数据可视化工具之选,三选一?

在数据可视化的世界中&#xff0c;选择一款合适的工具对于提升工作效率和洞察力至关重要。本文将对三款主流数据可视化工具进行详细比较&#xff0c;包括山海鲸可视化、Echarts和D3.js&#xff0c;以帮助您做出明智的选择。 山海鲸可视化 山海鲸可视化是一款免费且功能强大的…

全面掌握Django的web框架Django Rest_Framework(一)

文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置&#xff08;1&#xff09;DRF需要以下依赖&#xff08;2&#xff09;创建django项目 4.序列化器的使用&#xff08;1&#xff09;创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…

phar反序列化漏洞

基础&#xff1a; Phar是一种PHP文件归档格式&#xff0c;它类似于ZIP或JAR文件格式&#xff0c;可以将多个PHP文件打包成一个单独的文件&#xff08;即Phar文件&#xff09;。 打包后的Phar文件可以像普通的PHP文件一样执行&#xff0c;可以包含PHP代码、文本文件、图像等各…

Web中的转发与重定向

转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中&#xff0c;转发和重定向都是用于将请求从一个页面传递到另一…

asp.net吃了么销售系统

asp.net吃了么销售系统 用户功能有首页购买商品 购物车 我的订单 后台管理员可以进行用户管理 菜品管理 订单管理 销售统计 asp.net吃了么销售系统是一个功能完善的在线购物平台&#xff0c;用户可以在首页浏览并购买各类商品。通过购物车功能&#xff0c;用户可以方便地管理…

ElasticSearch 应用实践 笔记

概述 介绍 ES 是一个开源的高扩展的分布式全文搜索引擎&#xff0c;是整个Elastic Stack技术栈的核心。它可以近乎实时的存储&#xff0c;检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。ElasticSearch的底层是开源库Lu…

什么样的评论更容易得到别人的关注

要发表吸引人的评论&#xff0c;可以注意这些个方面&#xff1a; 合适的软件&#xff1a;用DT浏览器的笔记本写文本&#xff0c;保存为图片&#xff0c;用图片的方式评论更容易得到别人的关注。 特别的观点&#xff1a;发表与众不同的观点&#xff0c;或者从不同的角度看待问…

上岸国考有多难?

国考笔试成绩已于2024年1月13日公布&#xff0c;听说宇宙的尽头是编制&#xff0c;今天用一份2024国考的数据帮大家探探路。数据来自和鲸平台&#xff0c;数据主要包括招考省市和部门、专业和学历要求、招考和报考人数。 经过一番探索&#xff0c;我发现一个上岸密码&#xff1…

成功解决AttributeError: ‘str‘ object has no attribute ‘keys‘

成功解决AttributeError: ‘str’ object has no attribute ‘keys’。 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;报错分析及解决方案&#x1f333;&#x1f333;字典对象的keys方法&#x1f333;&#x1f333;结尾&#x1f333; &…

01、全文检索 ------ 反向索引库 与 Lucene 的介绍

目录 全文检索 ------ 反向索引库 与 LuceneSQL模糊查询的问题反向索引库反向索引库的查询 Lucene&#xff08;全文检索技术&#xff09;Lucene能做什么Lucene存在的问题Solr 和 Elasticsearch 与 Lucene 的关系 全文检索 ------ 反向索引库 与 Lucene MySQL一些索引词汇解释 …

MIMIC-IV-ED数据集介绍

MIMIC-IV-ED v2.2 Abstract MIMIC-IV-ED 是一个大型的免费数据库&#xff0c;记录了2011年至2019年间急诊部门(ED)贝斯以色列女执事医疗中心的入院情况。该数据库包含约425,000个 ED 停留。生命体征&#xff0c;分类信息&#xff0c;药物协调&#xff0c;药物管理和出院诊断是…

android 自定义下拉框

一、 简介&#xff1a; 原生Android 提供的spinner下拉框不怎么方便&#xff0c;样式有点丑。修改起来麻烦&#xff0c;于是就自己动手写了一下拉列表。 实现原理使用的是&#xff0c;popwindow弹框&#xff0c;可实现宽高自定义&#xff0c;下拉列表使用listview. 二、pop弹框…

python爬虫2

1.table 是表格&#xff0c;tr是行&#xff0c;td是列 ul li是无序列标签用的较多&#xff0c;ol li是有序列标签 最基本的结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title> Title </title>…

《区块链简易速速上手小册》第6章:区块链在金融服务领域的应用(2024 最新版)

文章目录 6.1 金融服务中的区块链6.1.1 金融服务中区块链的基础6.1.2 主要案例&#xff1a;跨境支付6.1.3 拓展案例 1&#xff1a;去中心化金融&#xff08;DeFi&#xff09;6.1.4 拓展案例 2&#xff1a;代币化资产 6.2 区块链在支付系统中的作用6.2.1 支付系统中区块链的基础…