DStruct 是一个易于移植且结构简洁的数据结构模板库
项目开源地址: https://github.com/Sunrisepeak/DStruct
特性/目标
- 易于移植,不依赖标准库(std)和其它三方库(只需要实现 dstruct-port.h)
- 易于使用(数据结构和算法分离设计,统一接口,std标准库风格)
- 易于学习/定制和改进(结构简洁且只有头文件)
- 现代 C++ / 泛型结构,包含多样丰富的数据结构
使用DStruct
默认dstruct-port.h 是由libc实现的, 如果是嵌入式设备或其他情况, 可自行实现dstruct-port.h
1. 下载源码
下载源码到(你的项目或其他选定的)本地目录
git clone git@github.com:Sunrisepeak/DStruct.git
2. 引用项目的dstruct.hpp接口文件
添加DStruct项目的根目录到include索引目录 -IyourPath/DStruct
静态数组
#include <iostream>
#include "dstruct.hpp"
int main() {
std::cout << "\n\nTesting: " << __FILE__ << std::endl;
dstruct::Array<int, 10> arr(2); // 0. test cntor
decltype(arr)::ValueType val = 6;
arr[0] = arr[-1] = val; // 1. test subscript access & assignment
for (int i = 0; i < arr.size(); i++) { // 3. positive / negative subscript access
std::cout << arr[-(i + 1)] << " : " << arr[i] << std::endl;
}
return 0;
}
链表
#include <iostream>
#include "dstruct.hpp"
int main() {
dstruct::DoublyLinkedList<int> list(10, 2);
dstruct::DLinkedList<double> list2(2, 1.1);
DSTRUCT_ASSERT(list2.size() == 2);
for (auto &v : list) { v = 3; }
for (auto v: list) { /* iterator */ }
DSTRUCT_ASSERT(list.back() == 3);
while (!list.empty()) {
list.pop_back();
}
DSTRUCT_ASSERT(list.size() == 0);
for (int i = 0; i < 10; i++) {
list.push_back(i);
DSTRUCT_ASSERT(list.back() == i);
}
DSTRUCT_ASSERT(list.size() == 10);
{ // test move
dstruct::DoublyLinkedList<int> list(10, 3);
DSTRUCT_ASSERT(list.size() == 10);
decltype(list) tmpList = dstruct::move(list);
int cnt = 0;
for (auto v : tmpList) { cnt++; /* iterator */ if (cnt == 11) break; }
DSTRUCT_ASSERT(tmpList.size() == cnt);
DSTRUCT_ASSERT(list.empty());
// test copy
list = tmpList;
auto it1 = list.begin();
auto it2 = tmpList.begin();
for (int i = 0; i < 10; i++, it1++, it2++) {
DSTRUCT_ASSERT(*it1 == *it2);
DSTRUCT_ASSERT(*it1 == 3);
DSTRUCT_ASSERT(it1.operator->() != it2.operator->());
}
}
return 0;
}
数据结构列表
类别 | 名称/具体实现 | 描述 | 示例 | 备注/状态 |
---|---|---|---|---|
Array | Array | 静态数组 | Array | |
Vector | 动态数组 | Vector | ||
List | Embedded List | 嵌入式链表 | EList | |
SLinkedList(Singly Linked List) | 单链表 | SLinkedList | ||
DLinkedList(Doubly Linked List) | 双链表 | DLinkedList | ||
Queue | Queue(adapter) | 队列适配器 | Queue | |
Deque(DoubleEndedQueue) | 双端队列 | Deque | ||
PriorityQueue | 优先队列(Heap的别名) | PriorityQueue | ||
Stack | Stack(adapter) | 栈适配器 | Stack | |
XValueStack/MinStack/MaxStack | 最值栈/最小值栈/最大值栈 | XValueStack | ||
Heap | Heap/MinHeap/MaxHeap | 堆/最小值堆/最大值堆 | Heap / MinHeap/ MaxHeap | |
Tree | EBinaryTree | 嵌入式二叉树 | ||
BSTree / BinarySearchTree | 二叉搜索树(默认less) | BSTree |
注: 功能开发中, 性能暂时未测试和优化
算法列表
范型算法
类别 | 算法 | 描述 | 备注 |
---|---|---|---|
通用 | for_each | 遍历 | |
堆(Heap) | Heap::build | 堆化 | |
Heap::sort / MinHeap::sort / MaxHeap::sort | 堆排序 | ||
树(Tree) | binary tree traversal(preorder/inorder/postorder) | 二叉树遍历(前序/中序/后序) | |
BSTree::traversal | 二叉搜索树遍历 |
构建和运行示例
curl -fsSL https://xmake.io/shget.text | bash # 安装 xmake
xmake # 编译/构建
xmake r dstruct_vector # 运行 dstruct_vector 示例,更多细节请查看xmake.lua
谁在用?
- DSVisual: 数据结构可视化组件库
- KHistory: 跨平台的按键检测/历史记录工具
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。