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

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,字符串中可以包含任何字符
  • 在返回字符串时,通过返回字符串的首地址和字节数减少因为长字符串复制带来的开销

相关文章:

  • 使用 React Flow 构建一个思维导图应用
  • 【2022改良版】学法减分助手PRO小程序源码
  • 深度学习(五)softmax 回归之:分类算法介绍,如何加载 Fashion-MINIST 数据集
  • 内网穿透 cpolar
  • mysql查询json字符串内容
  • 基于java web的中小型人力资源管理系统
  • LuatOS-SOC接口文档(air780E)--nimble - 蓝牙BLE库(nimble版)
  • 【SpringBoot篇】分页查询 | 扩展SpringMvc的消息转换器
  • 「引流工具」火炬多平台多功能引流高效推广脚本,抖音+快手+小红书多平台自动引流软件
  • 【人工智能Ⅰ】7-KNN 决策树
  • IDEA远程一键部署SpringBoot到Docker
  • Qt控件按钮大全
  • 【佳学基因检测】在LARAVEL中如何使用和设置路由组
  • <MySQL> 什么是数据库事务?事务该如何使用?
  • ZYNQ_project:uart(odd,even)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • bootstrap创建登录注册页面
  • Computed property XXX was assigned to but it has no setter
  • JavaScript设计模式系列一:工厂模式
  • Node + FFmpeg 实现Canvas动画导出视频
  • Python_OOP
  • springMvc学习笔记(2)
  • SSH 免密登录
  • win10下安装mysql5.7
  • 爱情 北京女病人
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前嗅ForeSpider教程:创建模板
  • 通过几道题目学习二叉搜索树
  • 我感觉这是史上最牛的防sql注入方法类
  • 翻译 | The Principles of OOD 面向对象设计原则
  • #NOIP 2014# day.2 T2 寻找道路
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (09)Hive——CTE 公共表达式
  • (20050108)又读《平凡的世界》
  • (C语言)fgets与fputs函数详解
  • (C语言)共用体union的用法举例
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)memcache、redis缓存
  • (转)Mysql的优化设置
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • **CI中自动类加载的用法总结
  • .NET 回调、接口回调、 委托
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • /proc/stat文件详解(翻译)
  • @Autowired 与@Resource的区别
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [20150321]索引空块的问题.txt
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [ACM] hdu 1201 18岁生日
  • [Angularjs]ng-select和ng-options