C++笔记:红黑树与哈希表

news2024/11/18 19:33:52

1.容器rb_tree

  • 按正常规则++it遍历,便能得到排序状态
  • 不能使用rb_tree的iterators改变元素值
  • 两种插入操作:insert_unique()和insert_equal()
template <class Key, class Value, class KeyOfValue, class Compare, class Alloc=alloc>
class rb_tree
{
protected:
		typedef __rb_tree_node<Value> rb_tree_node;
public:
		typedef rb_tree_node* link_type;
protected:
		size_type node_count;
		link_type header;  // 指向红黑树节点的指针
		Compare key_compare;  // key值比较方法
};

rb_tree<int, int, identity<int>, less<int>, alloc> itree;

2.容器set,multiset

  • 元素按照key值自动排序
  • set/multiset提供遍历操作,不能使用迭代器来改变元素的Key(Key就是data)
  • set的所有操作,都在呼叫底层rb_tree的操作
template <class Key, class Compare = less<Key>, class Alloc=alloc>
class set{
public:
		typedef Key key_type;
		typedef Key value_type;
		typedef Compare key_compare;
		typedef Compare value_compare;
private:
		typedef rb_tree<key_value, value_type, identity<value_type>, key_compare, Alloc> rep_type;
		rep_type t;
public:
		typedef typename rep_type::**const_iterator** iterator;  // 为了禁止user对元素赋值

3.容器map,multimap

  • 元素按照key值自动排序
  • 提供遍历操作,不能使用迭代器来改变元素的Key。但可以用它来改变元素的data
template <class Key, class T, class Compare = less<Key>, class Alloc=alloc>
class map{
public:
		typedef Key key_type;
		typedef T data_type;
		typedef T mapped_type;
		typedef pair<const Key, T> value_type;
		typedef Compare key_compare;
private:
		typedef rb_tree<key_type, value_type, select1st<value_type>, key_compare, Alloc> rep_type;
		rep_type t;
public:
		typedef typename rep_type::iterator iterator;
template<class Arg, class Result>
struct unary_function{
		typedef Arg argument_type;
		typedef Result result_type;
}

template<class Pair>
struct select1st:public unary_function<Pair, typename Pair::first_type>
{
		const typename Pair::first_type& operaor()(const Pair&x) const 
		{return x.first};
}
  • set的元素既是key也是value,修改任何一个元素都会破坏集合的有序性和唯一性,因此不允许修改。
  • map的元素是键值对,键必须保持不变以保证有序性,但值的修改不会影响有序性,因此允许修改值。

4.容器hashtable

  • rehashing:当我们需要安插的元素数目大于篮子的数目,就需要将原本的篮子数目扩充近一倍

 

template <class Value, class Key, class HashFun, class ExtractKey, class EqualKey, class Alloc=alloc>
class hashtable {
public:
		typedef HashFun hasher; // 散射函数
		typedef EqualKey key_equal; // 比较key值是否相等
		typedef size_t size_type;
private:
		// size = 1+1+1+12+4 = 19 -> 20
		hasher hash;  // 空函数对象:1
		key_equal equals;  // 空函数对象:1
		ExtractKey get_key;  // 空函数对象:1
		typedef _hashtable_node<Value> node;
		
		vector<node*, Alloc> buckets;  // vector中有三个指针:12
		size_type num_elements;  // 4
public:
		size_type bucket_count() const {return buckets.size();}

template <class Value>
struct __hashtable_node{
		__hashtable_node* next;  // 4
		Value val;  // 4
}

 

实际调用:

hashtable<const char*, const char*, hash<const char*>, identity<const char*>, eqstr, alloc> 
ht(50, hash<const chat*>(), eqstr());  // 50代表的是哈希表的初始桶(bucket)数量
ht.insert_unique("kiwi");

// 比较两个C语言风格的字符串是否相等,可以用strcmp()
// 但它返回的是-1,0,1,不是bool类型,因此需要加一层外套
// const char*表示指向字符串的指针,通过指针可以访问整个字符串
struct eqstr{
		bool operator()(const char* s1, const char* s2) const
		{return strcmp(s1,s2) == 0;}
};
  • C语言中的字符串是以'\\0'(空字符)结尾的字符数组。使用const char*表示指向字符数组的指针,而不是单个字符。如果你使用的是const char,那只表示一个字符,而不是一个字符串。
  • 比较两个字符串需要用指针遍历每个字符,因此要使用const char*
template<> 
struct hash<const char*>
{
		size_type operator()(const char* s) const
		{
				size_type hash = 0;
				while(*s)  // 遍历字符串中的每一个字符
				{
						hash = hash * 101 + *s++;  // 计算当前字符的ASCII值
				}
				return hash;
		}
};

5.unordered_set容器

unordered_set<string> c;
// 第i号篮子里有多少个元素
for(unsigned i=0; i<20; i++){
		cout << "bucket #" << i << c.bucket_size(i) << " elements.\\n";
}

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

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

相关文章

基于Zookeeper的分布式锁

分布式锁的介绍 在Java的多线程部分&#xff0c;我们知道如果在单个jvm进程中&#xff0c;多个线程之间同时访问一个资源&#xff0c;此时会有多线程的安全问题。为了解决这个线程安全的问题&#xff0c;我们可以使⽤“锁”来实现。但是&#xff0c;多个jvm进程之间如果同时访问…

计算机毕业设计 | SpringBoot社区物业管理系统 小区管理(附源码)

1&#xff0c; 概述 1.1 课题背景 近几年来&#xff0c;随着物业相关的各种信息越来越多&#xff0c;比如报修维修、缴费、车位、访客等信息&#xff0c;对物业管理方面的需求越来越高&#xff0c;我们在工作中越来越多方面需要利用网页端管理系统来进行管理&#xff0c;我们…

【源码】java + uniapp交易所源代码/带搭建教程java交易所/完整源代码

java uniapp交易所源代码/带搭建教程java交易所/完整源代码 带简洁教程&#xff0c;未测 java uniapp交易所源代码/带搭建教程java交易所/完整源代码 - 吾爱资源网

软件需求开发管理规程-Word原件(配套软件全资料文档)

1. 目的 2. 适用范围 3. 参考文件 4. 术语和缩写 5. 需求获取的方式 5.1. 与用户交谈向用户提问题 5.1.1. 访谈重点注意事项 5.1.2. 访谈指南 5.2. 参观用户的工作流程 5.3. 向用户群体发调查问卷 5.4. 已有软件系统调研 5.5. 资料收集 5.6. 原型系统调研 5.6.1. …

Android11热点启动和关闭

Android官方关于Wi-Fi Hotspot (Soft AP) 的文章&#xff1a;https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager类中有一套系统 API 可以控制热点的开和关&#xff0c;代码如下&#xff1a; 开启热点&#xff1a; // SoftApC…

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…

基于Ruoyi-Cloud-Plus重构黑马项目-学成在线

文章目录 一、系统介绍二、系统架构图三、参考教程四、演示图例机构端运营端用户端开发端 一、系统介绍 毕设&#xff1a;基于主流微服务技术栈的在线教育系统的设计与实现 前端仓库&#xff1a;https://github.com/Xiamu-ssr/Dragon-Edu-Vue3 后端仓库&#xff1a;https://g…

Nodejs(文件操作,构建服务器,express,npm)

文章目录 文件操作1.读取文件1&#xff09;步骤2&#xff09;范例 2.写文件1&#xff09;步骤2&#xff09;范例 3.删除文件4.重命名文件夹5删除文件夹 Url1.url.parse()2.url.fomat() Query1.query.parse()2.query.stringfy()3.编码和解码 第三方模块1.nodemailer2.body-parse…

学 C/C++ 具体能干什么?

学习 C 和 C 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;这两种语言以其高性能和低级控制而闻名&#xff0c;特别适合以下几个领域&#xff1a; 1. 系统编程 C 和 C 是系统编程的首选语言&#xff0c;适用于操作系统、驱动程序和嵌入式系统开发。 操作系统开发…

VLC播放器(全称VideoLAN Client)

一、简介 VLC播放器&#xff08;全称VideoLAN Client&#xff09;是一款开源的多媒体播放器&#xff0c;由VideoLAN项目团队开发。它支持多种音视频格式&#xff0c;并能够在多种操作系统上运行&#xff0c;如Windows、Mac OS X、Linux、Android和iOS等。VLC播放器具备播放文件…

SSH 远程登录系统和远程拷贝

文章目录 目录 文章目录 前言 一.SSH的基本用法 SSH基本用法&#xff1a; SSH无密码登录 二.SSH安全设置 三.SSH限制用户 前言 很多时候服务器并没有服务器&#xff0c;我们也不能每次都通过控制台去管理服务器&#xff0c;这时候就需要远程登录&#xff0c;相比于Telnet&a…

vue项目打包教程

如果是用 vue-cli 创建的项目&#xff0c;则项目目录中没有 config 文件夹&#xff0c;所以我们需要自建一个配置文件&#xff1b;在vue项目目录下创建文件 vue.config.js&#xff0c;需注意文件名称必须是 vue.config.js&#xff0c;然后在文件中插入以下代码&#xff1a; 文件…

PyTorch深度学习快速入门——P1-P13

环境配置 Anaconda&#xff0c;创建conda create -n pytorch python3.12&#xff0c;使用conda activate pytorch切换到环境。安装pytorch&#xff0c;conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia&#xff0c;使用import torch&…

用常识滚雪球:拼多多的内生价值,九年的变与不变

2024年5月22日&#xff0c;拼多多公布了今年一季度财报&#xff0c;该季度拼多多集团营收868.1亿元&#xff0c;同比增长131%&#xff0c;利润306.0亿&#xff0c;同比增长了202%&#xff0c;数据亮眼。 市场对拼多多经历了“看不见”、“看不懂”、“跟不上”三个阶段。拼多多…

【图论】最短路(一)

发现之前做的题很乱&#xff0c;用小笔记把看过的博客和题目分类记录一下&#xff0c; 代码参考了很多佬&#xff0c;是标注出来的链接&#xff0c;若不同意我就删掉&#xff08;鞠躬&#xff09; 找了几张好点的&#xff0c;图来源图中的id和acwing 1.dijkstra 依次找到距…

【Week-R1】RNN实现心脏病预测,基于tensorflow框架

文章目录 一、什么是RNN&#xff1f;二、准备环境和数据2.1 导入数据 三、构建模型四、训练和预测五、其他&#xff08;1&#xff09;sklearn模块导入报错&#xff1a;ModuleNotFoundError: No module named sklearn&#xff08;2&#xff09;优化器改为SGD&#xff0c;accurac…

FTP协议——BFTPD基本操作(Ubuntu+Win)

1、描述 本机&#xff08;Win10&#xff09;与虚拟机&#xff08;Ubuntu22.04.4&#xff09;上的BFTPD服务器建立FTP连接&#xff0c;执行一些基本操作。BFTPD安装教程&#xff1a;FTP协议——BFTPD安装&#xff08;Linux&#xff09;-CSDN博客 2、 步骤 启动BFTPD。启动文件…

BGP选路规则

配置地址&#xff0c;AS123使用ospf保证通讯&#xff0c;修改接口类型保证ospf学习环回20.0,30.0,100.0 地址时&#xff0c;是以24位掩码学习&#xff0c;R1&#xff0c;R2&#xff0c;R3都处于BGP边界&#xff0c;各自都需要宣告三者的私网环回 1&#xff0c; [R4]ip ip-prefi…

Radware Alteon负载均衡-配置证书组

证书组&#xff1a;可以使用证书组将多个服务器证书与虚拟服务相关联。这提供了对服务器名称指示(Server Namelndication&#xff0c;SNI)的支持&#xff0c;允许在相同的IP和端口后面托管多个主机名。使用SNI&#xff0c;浏览器发送请求的主机名&#xff0c;使服务器能够在进行…

【机器学习300问】96、怎么理解卷积神经网络CNN中的卷积操作?

卷积操作是卷积神经网络&#xff08;CNN&#xff09;中的一种核心组件。要讲清楚卷积操作&#xff0c;我们只需要回答以下四个问题&#xff1a;什么是卷积核&#xff1f;卷积运算的规则是什么&#xff1f;padding是什么&#xff1f;stride是什么&#xff1f; 下面让我以图像处理…