一个完全独立实现的 STL 库,不依赖标准库,专注于核心容器和算法的实现。
- 深入理解 STL 的设计思想和实现原理
- 提供轻量级的 STL 替代方案
- 学习现代 C++ 编程技巧和最佳实践
- 为嵌入式或特殊环境提供 STL 功能
- 零依赖:完全独立实现,不依赖标准库
- STL 兼容:接口设计与 STL 保持一致
- 内存安全:严格的内存管理和异常安全保证
- 性能优先:优化的算法实现和内存布局
- 可扩展性:模块化设计,易于扩展新功能
所有组件都在 sugar
命名空间下,避免与标准库冲突。
设计亮点:
- 完整的类型特征系统,支持编译时类型判断
- 使用 SFINAE 技术实现类型推导
- 支持自定义类型特征扩展
核心功能:
// 基础类型判断
is_integral<T> // 整数类型判断
is_floating_point<T> // 浮点类型判断
is_pointer<T> // 指针类型判断
is_reference<T> // 引用类型判断
// 类型转换
remove_reference<T> // 移除引用
add_pointer<T> // 添加指针
decay<T> // 类型衰减
// 条件类型
conditional<B, T, F> // 条件类型选择
enable_if<B, T> // 条件启用类型
设计亮点:
- 统一的异常处理机制
- 条件编译支持,可禁用异常
- 自定义异常类型,提供详细错误信息
核心功能:
// 异常宏
SUGAR_THROW_BAD_ALLOC_IF(condition, message)
SUGAR_THROW_LENGTH_ERROR_IF(condition, message)
SUGAR_CONDITION_CHECK(condition, message)
// 异常类型
bad_alloc // 内存分配失败
length_error // 长度错误
out_of_range // 越界访问
设计亮点:
- 完美转发实现
- 移动语义支持
- 类型安全的交换操作
核心功能:
// 完美转发
forward<T>(t) // 完美转发
move(t) // 移动语义
// 类型操作
swap(a, b) // 类型安全交换
pair<T1, T2> // 键值对容器
make_pair(t1, t2) // 创建键值对
设计亮点:
- 分层分配器架构
- 内存池优化小对象分配
- 支持自定义分配策略
- 异常安全的内存管理
核心功能:
// 基础分配器
allocator<T> // 通用分配器
pool_allocator<T> // 内存池分配器
// 分配器特征
allocator_traits<Alloc> // 分配器特征萃取
// 内存操作
allocate(size) // 内存分配
deallocate(ptr) // 内存释放
construct(ptr, args) // 对象构造
destroy(ptr) // 对象析构
设计亮点:
- 完整的迭代器概念体系
- 迭代器特征萃取
- 迭代器适配器支持
- 类型安全的迭代器操作
核心功能:
// 迭代器标签
input_iterator_tag
output_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
// 迭代器特征
iterator_traits<Iter> // 迭代器特征萃取
// 迭代器适配器
reverse_iterator<Iter> // 反向迭代器
// 迭代器操作
advance(it, n) // 迭代器前进
distance(first, last) // 计算距离
设计亮点:
- 通用算法设计,支持自定义比较器
- 迭代器抽象,支持不同容器
- 优化的算法实现
核心功能:
// 查找算法
find(first, last, value)
find_if(first, last, pred)
// 比较算法
equal(first1, last1, first2)
lexicographical_compare(first1, last1, first2, last2)
// 排序算法
sort(first, last)
sort(first, last, comp)
// 其他算法
copy(first, last, result)
fill(first, last, value)
swap_ranges(first1, last1, first2)
设计亮点:
- 函数对象适配器
- 支持函数指针、成员函数、lambda
- 类型安全的函数调用
核心功能:
// 比较函数对象
less<T>()
greater<T>()
equal_to<T>()
// 逻辑函数对象
logical_and<T>()
logical_or<T>()
logical_not<T>()
// 算术函数对象
plus<T>()
minus<T>()
multiplies<T>()
divides<T>()
设计亮点:
- 动态扩容机制,支持自定义扩容策略
- 异常安全保证,强异常安全保证
- 内存布局优化,减少内存碎片
- 支持移动语义,提高性能
核心功能:
// 构造和赋值
vector<T>() // 默认构造
vector<T>(size, value) // 指定大小构造
vector<T>(first, last) // 迭代器范围构造
vector<T>(initializer_list) // 初始化列表构造
// 元素访问
at(index) // 边界检查访问
operator[](index) // 快速访问
front() / back() // 首尾元素访问
// 容量操作
size() / empty() // 大小查询
capacity() / max_size() // 容量查询
reserve(size) / shrink_to_fit() // 容量调整
// 修改器
push_back(value) // 尾部插入
pop_back() // 尾部删除
insert(pos, value) // 指定位置插入
erase(pos) // 指定位置删除
clear() // 清空容器
// 迭代器
begin() / end() // 正向迭代器
rbegin() / rend() // 反向迭代器
设计亮点:
- 双向链表实现,支持 O(1) 头尾操作
- 哨兵节点设计,简化边界处理
- 高效的插入删除操作
- 支持复杂的链表操作(merge、splice、reverse)
核心功能:
// 构造和赋值
list<T>() // 默认构造
list<T>(size, value) // 指定大小构造
list<T>(first, last) // 迭代器范围构造
list<T>(initializer_list) // 初始化列表构造
// 元素访问
front() / back() // 首尾元素访问
// 容量操作
size() / empty() // 大小查询
max_size() // 最大容量
// 修改器
push_back(value) / push_front(value) // 头尾插入
pop_back() / pop_front() // 头尾删除
insert(pos, value) // 指定位置插入
erase(pos) // 指定位置删除
clear() // 清空容器
// 特殊操作
merge(other) // 合并有序链表
splice(pos, other) // 移动整个链表
splice(pos, other, it) // 移动单个元素
splice(pos, other, first, last) // 移动元素范围
remove(value) // 删除指定值
unique() // 删除连续重复元素
sort() // 排序
reverse() // 反转
// 迭代器
begin() / end() // 正向迭代器
rbegin() / rend() // 反向迭代器
- C++11 或更高版本
- CMake 3.10 或更高版本
- 支持的操作系统:Linux、Windows、macOS
# 克隆项目
git clone <repository-url>
cd MyMiniSTL
# 创建构建目录
mkdir build && cd build
# 配置和编译
cmake ..
make
# 运行测试
./test/bin/test_vector
./test/bin/test_list
# ... 其他测试
#include "vector.h"
#include "list.h"
#include "algorithm.h"
#include <iostream>
int main() {
// 使用 vector
sugar::vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6);
// 使用算法
sugar::sort(vec.begin(), vec.end());
// 使用 list
sugar::list<int> lst = {10, 20, 30};
lst.push_front(0);
// 遍历
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
项目包含完整的测试套件:
- 单元测试:每个组件都有对应的测试文件
- 功能测试:验证所有公共接口的正确性
- 边界测试:测试边界条件和异常情况
- 性能测试:验证大规模数据处理的性能
cd build
make
# 运行所有测试
for test in test/bin/test_*; do
echo "Running $test..."
$test
done
- 分层分配器:支持不同分配策略,从简单到复杂
- 内存池优化:小对象使用内存池,减少内存碎片
- 异常安全:强异常安全保证,内存泄漏防护
- SFINAE 技术:编译时类型推导和条件编译
- 类型特征:完整的类型特征系统,支持元编程
- 完美转发:零开销的参数传递
- 概念层次:清晰的迭代器概念体系
- 适配器模式:支持迭代器适配和转换
- 类型安全:编译时类型检查
- STL 兼容:完全兼容 STL 接口
- 性能优化:针对不同使用场景的优化
- 内存布局:优化的内存布局和访问模式
- 通用设计:支持自定义比较器和谓词
- 迭代器抽象:算法与容器解耦
- 性能优化:针对不同数据规模的优化
- 统一机制:一致的异常处理策略
- 条件编译:可配置的异常支持
- 错误信息:详细的错误描述和定位
- 零开销抽象:编译时优化,运行时零开销
- 内存效率:优化的内存布局和分配策略
- 算法优化:针对不同数据规模的算法选择
- 缓存友好:考虑 CPU 缓存的数据布局
- 实现更多容器(map、set、queue、stack)
- 添加更多算法(搜索、排序、数值算法)
- 支持并行算法
- 添加内存调试工具
- 性能基准测试套件
- 文档和教程完善
欢迎贡献代码、报告问题或提出建议!
- Fork 项目
- 创建功能分支
- 提交更改
- 推送到分支
- 创建 Pull Request
本项目采用 MIT 许可证,详见 LICENSE 文件。
- sugar - 项目创建者和主要维护者
MyMiniSTL - 重新定义 STL 的实现艺术 🚀stl mini version