Rust有序迭代器扩展库sorted-iter的使用,sorted-iter提供高效排序迭代器适配器和工具函数

Rust有序迭代器扩展库sorted-iter的使用

sorted-iter是一个Rust库,它为编译时已知有序的标准库迭代器提供了集合和关系操作。

集合操作

use sorted_iter::SortedIterator;

let primes = btreeset! { 2, 3, 5, 7, 11, 13u64 }.into_iter();
let fibs = btreeset! { 1, 2, 3, 5, 8, 13u64 }.into_iter();
let fib_primes = primes.intersection(fibs);

关系操作

use sorted_iter::SortedPairIterator;

let cities = btreemap! {
  1 => "New York",
  2 => "Tokyo",
  3u8 => "Berlin"
}.into_iter();
let countries = btreemap! {
  1 => "USA",
  2 => "Japan",
  3u8 => "Germany"
}.into_iter();
let cities_and_countries = cities.join(countries);

完整示例代码

集合操作示例

use sorted_iter::SortedIterator;
use std::collections::BTreeSet;

fn main() {
    // 创建两个有序集合
    let primes: BTreeSet<u64> = [2, 3, 5, 7, 11, 13].iter().cloned().collect();
    let fibs: BTreeSet<u64> = [1, 2, 3, 5, 8, 13].iter().cloned().collect();
    
    // 获取交集
    let fib_primes = primes.into_iter().intersection(fibs.into_iter());
    
    // 打印结果
    println!("Fibonacci primes: {:?}", fib_primes.collect::<Vec<_>>());
    // 输出: Fibonacci primes: [2, 3, 5, 13]
}

关系操作示例

use sorted_iter::SortedPairIterator;
use std::collections::BTreeMap;

fn main() {
    // 创建两个有序映射
    let mut cities = BTreeMap::new();
    cities.insert(1, "New York");
    cities.insert(2, "Tokyo");
    cities.insert(3, "Berlin");
    
    let mut countries = BTreeMap::new();
    countries.insert(1, "USA");
    countries.insert(2, "Japan");
    countries.insert(3, "Germany");
    
    // 执行连接操作
    let cities_and_countries = cities.into_iter().join(countries.into_iter());
    
    // 打印结果
    for (id, (city, country)) in cities_and_countries {
        println!("{}: {} ({})", id, city, country);
    }
    // 输出:
    // 1: New York (USA)
    // 2: Tokyo (Japan)
    // 3: Berlin (Germany)
}

保留顺序的转换示例

use sorted_iter::*;

fn main() {
    let odd = (1..31).step_by(2);
    let multiples_of_3 = (3..30).step_by(3);
    let either = odd.union(multiples_of_3);
    
    println!("Numbers: {:?}", either.collect::<Vec<_>>());
}

手动标记有序迭代器示例

use sorted_iter::*;
use sorted_iter::assume::*;

fn main() {
    let odd = vec![1,3,5,7u8].into_iter().assume_sorted_by_item();
    let even = vec![2,4,6,8u8].into_iter().assume_sorted_by_item();
    let all = odd.union(even);
    
    println!("All numbers: {:?}", all.collect::<Vec<_>>());
}

sorted-iter库通过编译时类型检查确保操作的高效性,特别适合处理有序数据集。它提供了类似SQL的集合和连接操作,同时保持了Rust的零成本抽象特性。


1 回复

Rust有序迭代器扩展库sorted-iter使用指南

sorted-iter是一个Rust库,提供了一系列高效排序迭代器适配器和工具函数,用于处理已排序或需要排序的迭代器。

主要特性

  • 提供已排序迭代器的适配器
  • 实现高效的合并、交集、差集等集合操作
  • 保持排序状态的同时进行各种操作
  • 性能优于先收集再排序的传统方法

安装

在Cargo.toml中添加依赖:

[dependencies]
sorted-iter = "0.4.0"

基本使用方法

1. 创建排序迭代器

use sorted_iter::sorted_iterator::SortedByKey;

let a = [1, 3, 5];
let b = [2, 4, 6];

let iter_a = a.iter().sorted();
let iter_b = b.iter().sorted();

2. 合并两个排序迭代器

use sorted_iter::sorted_iterator::SortedIterator;
use sorted_iter::assume::AssumeSortedByKeyExt;

let a = [1, 3, 5];
let b = [2, 4, 6];

let merged = a.iter().assume_sorted_by_key().merge(b.iter().assume_sorted_by_key());
assert_eq!(merged.collect::<Vec<_>>(), vec![&1, &2, &3, &4, &5, &6]);

3. 集合操作

use sorted_iter::assume::AssumeSortedByKeyExt;

let a = [1, 2, 3, 4].iter().assume_sorted_by_key();
let b = [3, 4, 5, 6].iter().assume_sorted_by_key();

// 交集
let intersection = a.intersection(b);
assert_eq!(intersection.collect::<Vec<_>>(), vec![&3, &4]);

// 并集
let union = a.union(b);
assert_eq!(union.collect::<Vec<_>>(), vec![&1, &2, &3, &3, &4, &4, &5, &6]);

// 差集
let difference = a.difference(b);
assert_eq!(difference.collect::<Vec<_>>(), vec![&1, &2]);

4. 使用自定义排序键

use sorted_iter::assume::AssumeSortedByKeyExt;

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

let people = [
    Person { name: "Alice".into(), age: 30 },
    Person { name: "Bob".into(), age: 25 },
    Person { name: "Charlie".into(), age: 35 },
];

// 按年龄排序
let sorted_by_age = people.iter().assume_sorted_by_key(|p| p.age);

for person in sorted_by_age {
    println!("{}: {}", person.name, person.age);
}
// 输出:
// Bob: 25
// Alice: 30
// Charlie: 35

高级用法

1. 链式操作

use sorted_iter::assume::AssumeSortedByKeyExt;

let a = [1, 3, 5, 7].iter().assume_sorted_by_key();
let b = [2, 4, 6, 8].iter().assume_sorted_by_key();
let c = [3, 6, 9].iter().assume_sorted_by_key();

let result = a.merge(b)
    .intersection(c)
    .filter(|&&x| x % 2 == 0)
    .collect::<Vec<_>>();

assert_eq!(result, vec![&6]);

2. 处理大型数据集

use sorted_iter::sorted_iterator::SortedByKey;
use std::iter::repeat_with;
use rand::Rng;

// 生成大型随机数据集
let mut rng = rand::thread_rng();
let data: Vec<u32> = repeat_with(|| rng.gen_range(0..1000))
    .take(1_000_000)
    .collect();

// 使用sorted-iter处理而不需要先排序整个向量
let result = data.iter()
    .sorted()
    .take(100)  // 只需要前100个元素
    .collect::<Vec<_>>();

assert_eq!(result.len(), 100);

性能提示

  1. 对于已经排序的数据,使用assume_sorted_by_key()sorted()更高效
  2. 链式操作会保持排序状态,避免中间收集和重新排序
  3. 对于大型数据集,惰性求值可以显著减少内存使用

sorted-iter特别适合处理需要排序的大型数据集或需要高效集合操作的场景,能够在不收集所有数据到内存的情况下进行处理。

完整示例代码

use sorted_iter::{assume::AssumeSortedByKeyExt, sorted_iterator::SortedIterator};
use rand::Rng;

fn main() {
    // 示例1: 创建排序迭代器
    let nums = [3, 1, 4, 1, 5, 9];
    let sorted_nums = nums.iter().sorted();
    println!("排序后的数字: {:?}", sorted_nums.collect::<Vec<_>>());
    
    // 示例2: 合并两个已排序的迭代器
    let a = [1, 3, 5].iter().assume_sorted_by_key();
    let b = [2, 4, 6].iter().assume_sorted_by_key();
    let merged = a.merge(b);
    println!("合并结果: {:?}", merged.collect::<Vec<_>>());
    
    // 示例3: 集合操作
    let set1 = [1, 2, 3, 4].iter().assume_sorted_by_key();
    let set2 = [3, 4, 5, 6].iter().assume_sorted_by_key();
    
    println!("交集: {:?}", set1.intersection(set2.clone()).collect::<Vec<_>>());
    println!("并集: {:?}", set1.union(set2.clone()).collect::<Vec<_>>());
    println!("差集: {:?}", set1.difference(set2.clone()).collect::<Vec<_>>());
    
    // 示例4: 自定义排序键
    #[derive(Debug)]
    struct Product {
        id: u32,
        price: f64,
    }
    
    let products = [
        Product { id: 1, price: 99.9 },
        Product { id: 2, price: 49.9 },
        Product { id: 3, price: 199.9 },
    ];
    
    let by_price = products.iter().assume_sorted_by_key(|p| p.price);
    println!("按价格排序的产品:");
    for p in by_price {
        println!("ID: {}, 价格: {}", p.id, p.price);
    }
    
    // 示例5: 链式操作
    let nums1 = [1, 3, 5, 7].iter().assume_sorted_by_key();
    let nums2 = [2, 4, 6, 8].iter().assume_sorted_by_key();
    let nums3 = [3, 6, 9].iter().assume_sorted_by_key();
    
    let result = nums1.merge(nums2)
        .intersection(nums3)
        .filter(|&&x| x % 2 == 0)
        .collect::<Vec<_>>();
    println!("链式操作结果: {:?}", result);
    
    // 示例6: 处理大型数据集
    let mut rng = rand::thread_rng();
    let large_data: Vec<u32> = (0..10_000).map(|_| rng.gen_range(0..1000)).collect();
    
    let top10 = large_data.iter()
        .sorted()
        .take(10)
        .collect::<Vec<_>>();
    println!("大型数据集中的前10个最小元素: {:?}", top10);
}
回到顶部