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;
}

数据结构列表

类别名称/具体实现描述示例备注/状态
ArrayArray静态数组Array
Vector动态数组Vector
ListEmbedded List嵌入式链表EList
SLinkedList(Singly Linked List)单链表SLinkedList
DLinkedList(Doubly Linked List)双链表DLinkedList
QueueQueue(adapter)队列适配器Queue
Deque(DoubleEndedQueue)双端队列Deque
PriorityQueue优先队列(Heap的别名)PriorityQueue
StackStack(adapter)栈适配器Stack
XValueStack/MinStack/MaxStack最值栈/最小值栈/最大值栈XValueStack
HeapHeap/MinHeap/MaxHeap堆/最小值堆/最大值堆Heap / MinHeap/ MaxHeap
TreeEBinaryTree嵌入式二叉树
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_begin_2023-07-03_18-12.png

  • KHistory 跨平台的按键检测/历史记录工具

key-history-demo.gif

其他


Sunrisepeak
1 声望0 粉丝

坚持学习,慢慢成长。 仰望星空,脚踏实地。 追求幸福与快乐,传递幸福与快乐