levelDB之基础数据结构-Slice

Slice是levelDB中用于操作字符串的数据结构,以字节为单位。

定义与实现

namespace leveldb {class LEVELDB_EXPORT Slice {public:// Create an empty slice.Slice() : data_(""), size_(0) {}// Create a slice that refers to d[0,n-1].Slice(const char* d, size_t n) : data_(d), size_(n) {}// Create a slice that refers to the contents of "s"Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}// Create a slice that refers to s[0,strlen(s)-1]Slice(const char* s) : data_(s), size_(strlen(s)) {}//拷贝函数的定义,默认是浅拷贝Slice(const Slice&) = default;Slice& operator=(const Slice&) = default;// 返回底层的字符数组指针const char* data() const { return data_; }// 返回data的字节数size_t size() const { return size_; }// 返回字符串是否为空bool empty() const { return size_ == 0; }// 重载下标运算符,用于获取第n个字节的字符char operator[](size_t n) const {assert(n < size());return data_[n];}// 清空slicevoid clear() {data_ = "";size_ = 0;}// 移除前n个字节void remove_prefix(size_t n) {assert(n <= size());data_ += n;size_ -= n;}// Return a string that contains the copy of the referenced data.std::string ToString() const { return std::string(data_, size_); }// Three-way comparison.  Returns value://   <  0 iff "*this" <  "b",//   == 0 iff "*this" == "b",//   >  0 iff "*this" >  "b"int compare(const Slice& b) const;// Return true iff "x" is a prefix of "*this"bool starts_with(const Slice& x) const {return ((size_ >= x.size_) && (memcmp(data_, x.data_, x.size_) == 0));}private:// 用于存储实际的字符数据const char* data_;// 字符串占用的字节数size_t size_;
};// 比较两个slice是否相同
inline bool operator==(const Slice& x, const Slice& y) {return ((x.size() == y.size()) &&(memcmp(x.data(), y.data(), x.size()) == 0));
}// 重载 != ,用于比较两个slice不相等
inline bool operator!=(const Slice& x, const Slice& y) { return !(x == y); }// 比较两个字符串的大小
// 按照字典序比较,0 表示相等;1 表示大于b;-1表示小于b
inline int Slice::compare(const Slice& b) const {const size_t min_len = (size_ < b.size_) ? size_ : b.size_;int r = memcmp(data_, b.data_, min_len);if (r == 0) {if (size_ < b.size_)r = -1;else if (size_ > b.size_)r = +1;}return r;
}}

整体来讲,Slice是levelDB实现用来操作字符串的封装类,内部通过维护一个char*和字符串所占的字节数size来表示一个slice结构,这样做其实和Redis对与字符串的实现有些许相似之处。

  • C和CPP中字符串都是不能包含’\0’的,而通过维护一个size,字符串中可以包含任何字符
  • 在返回字符串时,通过返回字符串的首地址和字节数减少因为长字符串复制带来的开销

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

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

相关文章

创建具有负载平衡和集群的可扩展 Node.js 应用程序

创建具有负载平衡和集群的可扩展 Node.js 应用程序 负载平衡是提高应用程序性能、可扩展性和可用性的一项重要技术。当客户端向负载均衡器发出请求时&#xff0c;负载均衡器根据预定义的规则将请求分发到不同的实例。 可以使用cluster集群模块或 PM2 等工具根据负载均衡器的流…

[PHP]关联和操作MySQL数据库然后将数据库部署到ECS

在Mac电脑上使用VS Code进行PHP开发并关联操作MySQL数据库&#xff0c;然后将数据库部署到ECS。 1.安装PHP和MySQL 确保你的Mac上已经安装了PHP和MySQL。你可以使用Homebrew来安装它们&#xff1a; $ brew install php $ brew install mysql 安装mysql完成后记住这一句: …

在.net 6版本以上的web api中添加像.net 5一样的Startup.cs

Program.cs中&#xff1a; 第一步&#xff1a;在var builder WebApplication.CreateBuilder(args);的后面添加上&#xff1a; var startup new Startup(builder.Configuration); startup.ConfigureServices(builder.Services); 第二步&#xff1a;在var app builder.Build()…

城市网吧视频智能监控方案,实现视频远程集中监控

网吧环境较为复杂&#xff0c;电脑设备众多且人员流动性大&#xff0c;极易发生人员或消防事故&#xff0c;亟需改变&#xff0c;TSINGSEE青犀AI智能网吧视频监管方案可以帮助实现对网吧环境和用户活动的实时监控和管理。 1、视频监控系统 在网吧内部布置高清摄像头&#xff0…

设计模式 -- 适配器模式(Adapter Pattern)

适配器模式&#xff1a;属于结构型模式&#xff0c;结合了两个独立接口的功能&#xff0c;作为 两个不兼容的接口之间的桥梁 。 介绍 意图&#xff1a;将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要…

【Shell脚本入门】

Shell中的特殊符号 1.$ 美元符号&#xff0c;用来表示变量的值。 如变量NAME的值为Mike&#xff0c;则使用$NAME就可以得到“Mike”这个值。2.# 井号&#xff0c;除了做为超级用户的提示符之外&#xff0c;还可以在脚本中做为注释的开头字母&#xff0c;每一行语句中&#xff…

WPF中可视化树和逻辑树的区别是什么

在WPF中&#xff0c;用户界面元素被组织成树形结构。这种结构主要分为两种&#xff1a;逻辑树&#xff08;Logical Tree&#xff09;和可视化树&#xff08;Visual Tree&#xff09;。它们在设计上各有特点和用途。 逻辑树&#xff08;Logical Tree&#xff09; 逻辑树是WPF中…

反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格…

笔记54:门控循环单元 GRU

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a

Bulk RNA-seq上下游分析

Bulk-RNA-seq上下游分析还是相对简单的&#xff0c;这次我以mouse为例&#xff0c;进行Bulk-RNA-seq上下游分析&#xff0c;并进行对应的图片绘制。 上游分析 1.软件准备 #安装所需软件 sudo apt install fastqc sudo apt install hisat2 sudo apt install cutadapt sudo ap…

快速幂:acwing 875. 快速幂

给定 n&#xfffd; 组 ai,bi,pi&#xfffd;&#xfffd;,&#xfffd;&#xfffd;,&#xfffd;&#xfffd;&#xff0c;对于每组数据&#xff0c;求出 abiimodpi&#xfffd;&#xfffd;&#xfffd;&#xfffd;mod&#xfffd;&#xfffd; 的值。 输入格式 第一行包…

腾讯云4核8G服务器性能如何多少钱一年?

腾讯云服务器4核8G配置优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云百科txybk.com分…

Spring Security OAuth2.0 实现分布式系统的认证和授权

Spring Security OAuth2.0 实现分布式系统的认证和授权 1. 基本概念1.1 什么是认证&#xff1f;1.2 什么是会话&#xff1f;1.2.1 基于 session 的认证方式1.2.2 基于 token 的认证方式 1.3 什么是授权&#xff1f;1.3.1 授权的数据模型 1.4 RBAC 介绍 2. Spring Security2.1 S…

什么是JPA? JPA在springBoot中怎么使用

JPA&#xff08;Java Persistence API&#xff09;是Java EE 5规范中的一套ORM规范&#xff0c;用于在Java应用程序中进行对象关系映射&#xff08;ORM&#xff09;。它定义了一组标准API&#xff08;接口和类&#xff09;&#xff0c;用于在Java应用程序中管理持久化对象。 在…

鸿蒙4.0开发笔记之DevEco Studio如何使用Previewer窗口预览器(一)

一、预览器作用 DevEco Studio预览器概况在HarmonyOS应用开发过程中&#xff0c;通过使用预览器&#xff0c;可以查看应用的UI效果&#xff0c;方便开发者实时查看应用的运行效果&#xff0c;随时调整代码。 二、打开Previewer预览器 1、正常启动 打开预览器的位置在DevEco…

Spring Boot - devtools 热部署

spring-boot-devtools是Spring Boot提供的一组开发工具&#xff0c;它旨在提高开发体验。这些工具包括应用程序的自动重新启动、自动刷新和远程调试等功能。下面是将spring-boot-devtools整合到Spring Boot应用程序中的步骤&#xff1a; 0、启用"Build project automatic…

4核8G服务器价格选择轻量还是CVM合适?

腾讯云服务器4核8G配置优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云百科txybk.com分…

Django之模型层

目录 一、前言 【1】测试脚本 【2】数据准备 二、单表操作 【1】数据的增加 【2】数据的删除 【3】数据的更改 三、常见的十几种查询方法 四、查看内部sql语句的方式 【1】方式一 【2】方式二 五、基于双下划线的查询 六、多表查询引入 【1】数据准备 【2】外键…

java8流处理器list转map的对比

文章目录 前言代码Collectors.toMap()方法有以下几个重载版本: 前言 写代码的时候&#xff0c;经常会需要处理拿到的数据&#xff0c;比如把list转成map&#xff0c;就有好多种写法&#xff0c;所以写文章理一下区别。 代码 假设我们有一个实体类User Data public class Us…

【论文阅读】A Survey on Video Diffusion Models

视频扩散模型&#xff08;Video Diffusion Model&#xff09;最新综述GitHub 论文汇总-A Survey on Video Diffusion Models。 paper&#xff1a;[2310.10647] A Survey on Video Diffusion Models (arxiv.org) 0. Abstract 本文介绍了AIGC时代视频扩散模型的全面回顾。简要介…