Rust轻量级STL实现库tinystl的使用,提供高效基础数据结构和算法支持

Rust轻量级STL实现库tinystl的使用,提供高效基础数据结构和算法支持

示例代码

use tinystl::StlData;

let data = StlData::read_from_file("my_file.stl")?;
data.write_binary_file("my_binary_file.stl")?;

完整示例

下面是一个完整的示例,展示如何使用tinystl库读取和写入STL文件:

use std::error::Error;
use tinystl::StlData;

fn main() -> Result<(), Box<dyn Error>> {
    // 从文件读取STL数据
    let stl_data = StlData::read_from_file("input.stl")?;
    
    // 打印读取到的三角形数量
    println!("读取到 {} 个三角形", stl_data.triangles().len());
    
    // 将STL数据写入二进制文件
    stl_data.write_binary_file("output_binary.stl")?;
    
    // 将STL数据写入ASCII文件
    stl_data.write_ascii_file("output_ascii.stl")?;
    
    Ok(())
}

特性

Bytemuck

Triangle类型派生Pod trait。

Serde

为所有类型派生SerializeDeserialize trait。

项目信息

  • 项目灵感来自并改编自cry-inc’s microstl library
  • 目标是提供一种零依赖的方式来轻松加载和写入STL文件
  • 假设所有二进制文件都是小端格式

安装

在项目目录中运行以下Cargo命令:

cargo add tinystl

或者在Cargo.toml中添加:

tinystl = "0.0.3"

许可证

MIT许可证


1 回复

Rust轻量级STL实现库tinystl使用指南

简介

tinystl是一个Rust实现的轻量级标准模板库(STL)替代方案,提供了高效的基础数据结构和算法支持。它专为需要STL功能但希望保持轻量级的Rust项目设计,特别适合嵌入式系统和资源受限环境。

主要特性

  • 轻量级实现,无额外依赖
  • 提供类似C++ STL的接口风格
  • 包含常用容器和算法
  • 注重性能和内存效率

安装方法

在Cargo.toml中添加依赖:

[dependencies]
tinystl = "0.1"  # 请使用最新版本

核心组件及使用示例

1. 向量(Vector)

use tinystl::vector::Vector;

fn main() {
    // 创建向量
    let mut vec = Vector::new();
    
    // 添加元素
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    
    // 访问元素
    println!("First element: {}", vec[0]); // 1
    println!("Vector size: {}", vec.size()); // 3
    
    // 迭代
    for &item in vec.iter() {
        println!("{}", item);
    }
    
    // 移除元素
    vec.pop_back();
    println!("After pop: {:?}", vec); // [1, 2]
}

2. 链表(List)

use tinystl::list::List;

fn main() {
    let mut list = List::new();
    
    list.push_back(10);
    list.push_front(5);
    list.push_back(20);
    
    println!("List size: {}", list.size()); // 3
    
    // 使用迭代器
    for item in list.iter() {
        println!("List item: {}", item);
    }
    
    // 移除元素
    list.pop_front();
    println!("Front after pop: {}", list.front().unwrap()); // 10
}

3. 哈希表(HashMap)

use tinystl::hashmap::HashMap;

fn main() {
    let mut map = HashMap::new();
    
    // 插入键值对
    map.insert("key1", 100);
    map.insert("key2", 200);
    
    // 访问值
    if let Some(value) = map.get("key1") {
        println!("Value for key1: {}", value); // 100
    }
    
    // 更新值
    map.insert("key1", 150);
    
    // 检查存在性
    println!("Contains key2: {}", map.contains_key("key2")); // true
    
    // 移除键
    map.remove("key2");
    println!("Size after remove: {}", map.len()); // 1
}

4. 算法

use tinystl::algorithm;
use tinystl::vector::Vector;

fn main() {
    let mut vec = Vector::new();
    vec.push_back(5);
    vec.push_back(2);
    vec.push_back(8);
    vec.push_back(1);
    
    // 排序
    algorithm::sort(&mut vec);
    println!("Sorted: {:?}", vec); // [1, 2, 5, 8]
    
    // 二分查找
    if let Ok(pos) = algorithm::binary_search(&vec, &5) {
        println!("Found 5 at position: {}", pos); // 2
    }
    
    // 反转
    algorithm::reverse(&mut vec);
    println!("Reversed: {:?}", vec); // [8, 5, 2, 1]
}

性能考虑

tinystl针对性能进行了优化,但在使用时仍需注意:

  1. 预分配容量以减少动态扩容

    let mut vec = Vector::with_capacity(100);
    
  2. 对于小型数据集,Vector通常比List更高效

  3. 在已知大小的集合上,使用数组可能比动态容器更高效

自定义类型支持

tinystl支持自定义类型,只需实现相应的trait:

use tinystl::vector::Vector;

#[derive(Debug, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let mut points = Vector::new();
    points.push_back(Point { x: 1, y: 2 });
    points.push_back(Point { x: 3, y: 4 });
    
    println!("Points: {:?}", points);
}

与标准库比较

tinystl相比Rust标准库:

  • 更轻量级
  • 接口更接近C++ STL风格
  • 适合需要STL迁移的项目
  • 功能集较小但更专注

适用场景

  • 从C++迁移到Rust的项目
  • 资源受限环境
  • 需要STL风格接口的项目
  • 教学和学习数据结构实现

tinystl为Rust开发者提供了一个轻量级的选择,特别适合那些熟悉C++ STL并希望在Rust中使用类似接口的开发者。

完整示例代码

下面是一个综合使用tinystl多个组件的完整示例:

use tinystl::vector::Vector;
use tinystl::hashmap::HashMap;
use tinystl::algorithm;

#[derive(Debug, PartialEq)]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    // 使用Vector存储自定义类型
    let mut people = Vector::new();
    people.push_back(Person {
        name: "Alice".to_string(),
        age: 30,
    });
    people.push_back(Person {
        name: "Bob".to_string(),
        age: 25,
    });
    
    // 使用HashMap
    let mut age_map = HashMap::new();
    for person in people.iter() {
        age_map.insert(&person.name, person.age);
    }
    
    // 查找年龄
    if let Some(age) = age_map.get("Alice") {
        println!("Alice's age: {}", age);
    }
    
    // 使用算法
    let mut ages = Vector::new();
    ages.push_back(30);
    ages.push_back(25);
    ages.push_back(40);
    ages.push_back(20);
    
    // 排序年龄
    algorithm::sort(&mut ages);
    println!("Sorted ages: {:?}", ages);
    
    // 反转
    algorithm::reverse(&mut ages);
    println!("Reversed ages: {:?}", ages);
    
    // 容量预分配
    let mut big_vec = Vector::with_capacity(1000);
    for i in 0..100 {
        big_vec.push_back(i);
    }
    println!("Big vector size: {}", big_vec.size());
}

这个完整示例展示了如何:

  1. 使用Vector存储自定义结构体
  2. 使用HashMap存储键值对
  3. 结合使用算法模块进行排序和反转操作
  4. 预分配大容量Vector以提高性能
回到顶部