当前位置: 首页 > news >正文

c++11 标准模板(STL)(std::unordered_set)(十三)

定义于头文件 <unordered_set>
template<

    class Key,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator<Key>

> class unordered_set;
(1)(C++11 起)
namespace pmr {

    template <class Key,
              class Hash = std::hash<Key>,
              class Pred = std::equal_to<Key>>
    using unordered_set = std::unordered_set<Key, Hash, Pred,
                                             std::pmr::polymorphic_allocator<Key>>;

}
(2)(C++17 起)

 

unordered_set is 是含有 Key 类型唯一对象集合的关联容器。搜索、插入和移除拥有平均常数时间复杂度。

在内部,元素并不以任何特别顺序排序,而是组织进桶中。元素被放进哪个桶完全依赖其值的哈希。这允许对单独元素的快速访问,因为哈希一旦,就准确指代元素被放入的桶。

不可修改容器元素(即使通过非 const 迭代器),因为修改可能更改元素的哈希,并破坏容器。

 

观察器

返回用于对关键哈希的函数

std::unordered_set<Key,Hash,KeyEqual,Allocator>::hash_function

hasher hash_function() const;

(C++11 起)

 返回对关键哈希的函数。

参数

(无)

返回值

哈希函数。

复杂度

常数。

返回用于比较键的相等性的函数

std::unordered_set<Key,Hash,KeyEqual,Allocator>::key_eq

key_equal key_eq() const;

(C++11 起)

返回比较关键相等性的函数。

参数

(无)

返回值

关键比较函数。

复杂度

常数。

 

非成员函数

比较 unordered_set 中的值
 

operator==,!=(std::unordered_set)
template< class Key, class Hash, class KeyEqual, class Allocator >

bool operator==( const unordered_set<Key,Hash,KeyEqual,Allocator>& lhs,

                 const unordered_set<Key,Hash,KeyEqual,Allocator>& rhs );
(1)
template< class Key, class Hash, class KeyEqual, class Allocator >

bool operator!=( const unordered_set<Key,Hash,KeyEqual,Allocator>& lhs,

                 const unordered_set<Key,Hash,KeyEqual,Allocator>& rhs );
(2)

 比较二个无序容器的内容。

若下列条件成立则二个无序容器 lhsrhs 相等:

  • lhs.size() == rhs.size()
  • 从 lhs.equal_range(lhs_eq1) 获得的每组等价元素 [lhs_eq1, lhs_eq2) 拥有在另一容器中从 rhs.equal_range(rhs_eq1) 获得的对应等价元素组 [rhs_eq1, rhs_eq2) ,且它们拥有下列属性:
  • std::distance(lhs_eq1, lhs_eq2) == std::distance(rhs_eq1, rhs_eq2) 。
  • std::is_permutation(lhs_eq1, lhs_eq2, rhs_eq1) == true 。

Key可相等比较 (EqualityComparable) 则行为未定义。

hash_function()key_eq() (C++20 前)key_eq() (C++20 起) 在 lhsrhs 上拥有不相同的行为,或若 Key 的 operator== 不是对于 key_eq() 所引入的等价关键组的细分(即若用 operator== 比较相等的二个元素落入不同划分),则行为未定义。

参数

lhs, rhs-要比较的无序容器

返回值

1) 若容器内容相等则为 true ,否则为 false 。

2) 若容器内容不相等则为 true ,否则为 false 。

复杂度

调用 value_type 上的 operator== 、调用 key_eq 所返回的谓词,及调用 hash_function 所返回的哈希器的次数,平均情况下与 N 成比例,最坏情况下与 N2 成比例,其中 N 是容器大小。

 

特化 std::swap 算法

std::swap(std::unordered_set)
template< class Key, class Hash, class KeyEqual, class Alloc >

void swap( unordered_set<Key,Hash,KeyEqual,Alloc>& lhs,

           unordered_set<Key,Hash,KeyEqual,Alloc>& rhs );
(C++11 起)
(C++17 前)
template< class Key, class Hash, class KeyEqual, class Alloc >

void swap( unordered_set<Key,Hash,KeyEqual,Alloc>& lhs,

           unordered_set<Key,Hash,KeyEqual,Alloc>& rhs ) noexcept(/* see below */);
(C++17 起)

 为 std::unordered_set 特化 std::swap 算法。交换 lhsrhs 的内容。调用 lhs.swap(rhs) 。

参数

lhs, rhs-要交换内容的容器

返回值

(无)

复杂度

常数。

异常

noexcept 规定:  

noexcept(noexcept(lhs.swap(rhs)))

(C++17 起)

调用示例 

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <unordered_set>
#include <time.h>using namespace std;struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}Cell &operator +=(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator +(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator *(const Cell &cell){x *= cell.x;y *= cell.y;return *this;}Cell &operator ++(){x += 1;y += 1;return *this;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}bool operator >(const Cell &cell) const{if (x == cell.x){return y > cell.y;}else{return x > cell.x;}}bool operator ==(const Cell &cell) const{return x == cell.x && y == cell.y;}
};struct myCompare
{bool operator()(const int &a, const int &b){return a < b;}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}std::ostream &operator<<(std::ostream &os, const std::pair<const int, Cell> &pCell)
{os << pCell.first << "-" << pCell.second;return os;
}struct CHash
{size_t operator()(const Cell& cell) const{size_t thash = std::hash<int>()(cell.x) | std::hash<int>()(cell.y);
//        std::cout << "CHash: " << thash << std::endl;return thash;}
};struct CEqual
{bool operator()(const Cell &a, const Cell &b) const{return a.x == b.x && a.y == b.y;}
};int main()
{std::cout << std::boolalpha;std::mt19937 g{std::random_device{}()};srand((unsigned)time(NULL));auto generate = [](){int n = std::rand() % 10 + 110;Cell cell{n, n};return cell;};std::unordered_set<Cell, CHash, CEqual> unordered_set1;while (unordered_set1.size() < 6){//6) 插入来自 initializer_list ilist 的元素。若范围中的多个元素拥有比较等价的关键,则插入哪个元素是未指定的unordered_set1.insert({generate()});}std::cout << "unordered_set1:   ";std::copy(unordered_set1.begin(), unordered_set1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::unordered_set<Cell, CHash, CEqual> unordered_set2;while (unordered_set2.size() < 6){//6) 插入来自 initializer_list ilist 的元素。若范围中的多个元素拥有比较等价的关键,则插入哪个元素是未指定的unordered_set2.insert({generate()});}std::cout << "unordered_set2:   ";std::copy(unordered_set2.begin(), unordered_set2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;//比较二个无序容器的内容。std::cout << "unordered_set1 == unordered_set2: " << (unordered_set1 == unordered_set2) << std::endl;std::cout << "unordered_set1 != unordered_set2: " << (unordered_set1 != unordered_set2) << std::endl;std::cout << std::endl;//为 std::unordered_set 特化 std::swap 算法。交换 lhs 与 rhs 的内容。调用 lhs.swap(rhs) 。std::swap(unordered_set1, unordered_set2);std::cout << "after swap:   " << std::endl;std::cout << "unordered_set1:   ";std::copy(unordered_set1.begin(), unordered_set1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << "unordered_set2:   ";std::copy(unordered_set2.begin(), unordered_set2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;return 0;
}

输出

 

相关文章:

c++11 标准模板(STL)(std::unordered_set)(十三)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

【2023】DevOps、SRE、运维开发面试宝典之ELKStack相关面试题

文章目录 1、elasticsearch的应用场景2、elasticsearch的特点3、Elasticsearch集群三种状态分别是什么?代表什么?4、Elasticsearch集群的优化方面5、Elasticsearch集群防止脑裂的配置参数?6、ELK日志采集平台架构组件介绍?7、Logstash组件的作用?8、收集Kubernetes集群程序…...

Hive中的高阶函数(二)

1、UDTF之explode函数 explode(array)将array列表里的每个元素生成一行&#xff1b; explode(map)将map里的每一对元素作为一行&#xff0c;其中key为一列&#xff0c;value为一列&#xff1b; 一般情况下&#xff0c;explode函数可以直接使用即可&#xff0c;也可以根据需要结…...

Java集合知识点总结

ArrayListLinkedListLinkedHashSetHashSetTreeSetHashTableHashMapTreeMap是否有序有序有序有序无序自然排序&#xff08;Comparator&#xff09;进行排序&#xff0c;默认升序使用的是重写comparTo方法无序无序自动排序元素是否为空可为null可为null不允许可为null不允许键允许…...

培训班出身的同学简历怎么做?面试要注意哪些?来自资深大厂HR的忠告

目录 1 不少培训班候选人的简历中&#xff0c;缺乏足够的商业项目年限 2 直接描述培训班学习经历会带来的负面影响 3 大龄转行Vs年轻的初级程序员&#xff0c;公司一般会如何选择&#xff1f; 4 经过培训班突击后&#xff0c;可以先面试小公司 5 面试官怎么面试有培训班经历…...

Hive3.1.3安装部署_最小化部署_元数据MySQL部署_Hiveserver2部署_metastore部署---大数据之Hive工作笔记0012

hbase 实时分析 hive 离线分析 这里是新版本的hive3.1.3的安装 关于hive的原理之前的博客已经详细说了 可以看到上面是hive运行的原理图 词法分析 语法分析...

javascript:void(0) 含义

我们经常会使用到 javascript:void(0) 这样的代码&#xff0c;那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢&#xff1f;javascript:void(0) 中最关键的是 void 关键字&#xff0c; void 是 JavaScript 中非常重要的关键字&#xff0c;该操作符指定要计算一个表…...

不用机器学习不用大数据,给你讲通ChatGPT的深层原理

ChatGPT现在看来已经异常火爆了&#xff0c;很多人已经熟知&#xff0c;并且开始练习使用或者开始利用他开始实践了。但仍然有很多人在观望&#xff0c;在疑惑&#xff0c;今天狗哥不用那些高端大气的机器学习亦或是大数据还给你讲通ChatGPT深层到底是个啥逻辑。 目录 1. 聊家…...

JavaScript中的循环类型

JavaScript 中有三种主要的循环类型: for、while 和 do...while。 for: 循环指定次数。 例如&#xff1a; for (let i 0; i < 5; i) {console.log(i); } while: 当条件为真时循环。 例如&#xff1a; let i 0; while (i < 5) {console.log(i);i; } do...while: 先执…...

Spring Boot+Vue前后端分离项目练习02之网盘项目利用token进行登陆验证

1.添加依赖 首先需要添加jwt对应的依赖。 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>2.添加配置 JWT由三部分构成&#xff0c;分别是 header, pa…...

springcloud常见面试题(2023最新)

目录前言一.微服务1.微服务是什么&#xff1f;2.你知道哪些RPC框架3.springCloud和Dubbo有什么区别4. SpringCloud由什么组成二.Spring Cloud Eureka1.Eureka包含几个组件2.Eureka的工作原理3.说一下什么是Eureka的自我保护机制4.什么是CAP原则5.都是服务注册中心&#xff0c;E…...

用户态驱动的两种方式-ixy学习

介绍在Linux下有两种启用用户态驱动的子系统&#xff1a;一个是UIO&#xff0c;另一个是VFIO&#xff0c;ixy这两种都支持。 UIO通过虚拟文件系统sysfs下的内存映射文件来暴露所有必要的接口以完成用户态的驱动。这些基于文件的系统调用接口给了我们充足的权限来获取设备资源而…...

机器学习 | 线性回归(单变量)

前文回顾&#xff1a;机器学习概述&#x1f4da;线性回归概念我们要使用一个数据集&#xff0c;数据集包含俄勒冈州波特兰市的住房价格。在这里&#xff0c;我要根据不同房屋尺寸所售出的价格&#xff0c;画出我的数据集。比方说&#xff0c;如果你朋友的房子是 1250 平方尺大小…...

C++基础知识【3】控制语句

目录 前言 一、条件语句 1.1、if 语句 1.2、if-else 语句 1.3、switch 语句 二、循环语句 2.1、while 循环 2.2、do-while 循环 2.3、for 循环 三、跳转语句 3.1、break语句 3.2、continue语句 3.3、goto语句 四、一些新特性 4.1、if 语句和 switch 语句…...

ImportError: Can not find the shared library: libhdfs3.so解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...

Qt插件开发总结5--主界面嵌入插件UI

文章目录一、前言二、效果展示三、嵌入插件UI1、插件接口文件添加UI指针2、插件子项目工程建立UI类3、插件类中创建UI类、使UI指针指向创建的UI类4、插件元信息中添加widget键值对&#xff0c;指示插件UI嵌入主界面中的位置5、主界面中预留接入点tabWidget6、插件管理器中元数据…...

一些关于linux process 和python process的记录

python mulprocess 主要用来生成另一个进程并运行 def func(i):print(helloworld)from multiprocessing import Process p Process(targetfunc,args(i, )) p.start()如果想要调用shell命令&#xff0c;可以采用os.popen 或者是 subprocess.run 但是前者只能执行命令并获取输…...

卡尔曼滤波——一种基于滤波的时序状态估计方法

文章目录1. Kalman滤波及其应用2. Kalman原理公式推导&#xff1a;Step 1&#xff1a;模型建立Step 2&#xff1a;开始Kalman滤波Step 3&#xff1a;迭代滤波本文是对 How a Kalman filter works, in pictures一文学习笔记&#xff0c;主要是提炼核心知识&#xff0c;方便作者快…...

什么是X6CrMo17-1

X6CrMo17-1X6CrMo17-1是在430的基礎上加入了鉬&#xff0c;提高鋼的耐點蝕、耐縫隙腐蝕性及強度等&#xff0c;比430鋼抗鹽溶液體性強。一、X6CrMo17-1對應牌號&#xff1a;1、國標GB-T標準&#xff1a;數字牌號&#xff1a;S11790、新牌號&#xff1a;10Cr17Mo、舊牌號&#x…...

软件测试是个人就能做?恕我直言,你可能是个“纯粹”的测试工具人,BUG收集器

作为过来人的我和你说说软件测试的真正情况。 前言 一个软件做出来&#xff0c;最不能少的是谁&#xff1f;毫无疑问是开发&#xff0c;开发是最了解软件运作的那个人&#xff0c;早期就有不少一人撸网站或者APP的例子&#xff0c;相当于一个人同时是产品、研发、测试、运维等…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...