当前位置: 首页 > 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,字符串中可以包含任何字符
  • 在返回字符串时,通过返回字符串的首地址和字节数减少因为长字符串复制带来的开销
http://www.lryc.cn/news/233904.html

相关文章:

  • 上位机模块之通用重写相机类
  • 机器人导航+OPENCV透视变换示例代码
  • KofamScan-KEGG官方推荐的使用系同源和隐马尔可夫模型进行KO注释
  • 代码随想录算法训练营第五十五天丨 动态规划part16
  • 【Linux】kernel与应用消息队列的一种设计
  • 我们常说的网络资产,具体是如何定义的?
  • WPF中可冻结对象
  • 【人工智能实验】A*算法求解8数码问题 golang
  • Kafka学习笔记(二)
  • Typora for Mac:打造全新文本编辑体验
  • TikTok与媒体素养:如何辨别虚假信息?
  • Spring Boot 中使用 ResourceLoader 加载资源的完整示例
  • 1688往微信小程序自营商城铺货商品采集API接口
  • QStatusBar开发详解
  • 后端接口性能优化分析-程序结构优化
  • 【SpringBoot3+Vue3】三【实战篇】-后端(优化)
  • DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(上)
  • 一个iOS tableView 滚动标题联动效果的实现
  • 代码执行相关函数以及简单例题
  • 大数据爬虫分析基于Python+Django旅游大数据分析系统
  • C# 结构体介绍
  • 【机器学习】特征工程:特征预处理,归一化、标准化、处理缺失值
  • Pytorch torch.norm函数详解用法
  • 【DevOps】Git 图文详解(二):Git 安装及配置
  • 亚马逊美国站CPC认证ASTM F963测试项目要求有哪些?
  • 通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件
  • Centos8配置Zabbix5.0中文汉化
  • 元数据管理,数字化时代企业的基础建设
  • 大数据之Hive:regexp_extract函数案例
  • tsconfig.json无法写入文件“XXXX“因为它会覆盖输入文件