Rust数组操作库array-concat的使用,高效合并数组与简化集合操作
Rust数组操作库array-concat的使用,高效合并数组与简化集合操作
介绍
array-concat 是一个用于数组拼接和分割的Rust宏库。
在Cargo.toml中添加依赖:
array-concat = "0.5.5"
示例
use array_concat::*;
const A: [u32; 3] = [1, 2, 3];
const B: [u32; 2] = [4, 5];
const C: [u32; concat_arrays_size!(A, B)] = concat_arrays!(A, B);
// Non-Copy struct
#[derive(Debug, PartialEq)]
struct S(bool);
const D: [S; 1] = [S(true)];
const E: [S; 1] = [S(false)];
const F: [S; concat_arrays_size!(D, E)] = concat_arrays!(D, E);
fn main() {
let c = concat_arrays!(A, B);
assert_eq!([1, 2, 3, 4, 5], C);
assert_eq!([1, 2, 3, 4, 5], c);
assert_eq!([S(true), S(false)], F);
// Split the array into three parts with lengths: 1, 3, and 1
assert_eq!(([1], [2, 3, 4], [5]), split_array!(c, 1, 3, 1));
let a = [1, 2, 3];
let b = [4, 5];
let c = concat_arrays!(a, b); // Size is inferred by the assert below
assert_eq!([1, 2, 3, 4, 5], c);
}
完整示例代码
// 引入array-concat库
use array_concat::*;
fn main() {
// 示例1: 合并基本类型数组
let arr1 = [1, 2, 3];
let arr2 = [4, 5];
let combined = concat_arrays!(arr1, arr2);
println!("Combined array: {:?}", combined); // 输出: [1, 2, 3, 4, 5]
// 示例2: 合并自定义结构体数组
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
let points1 = [Point { x: 1, y: 2 }];
let points2 = [Point { x: 3, y: 4 }];
let all_points = concat_arrays!(points1, points2);
println!("All points: {:?}", all_points); // 输出: [Point { x: 1, y: 2 }, Point { x: 3, y: 4 }]
// 示例3: 分割数组
let large_array = [1, 2, 3, 4, 5, 6, 7, 8];
let (first, middle, last) = split_array!(large_array, 2, 4, 2);
println!("First: {:?}", first); // 输出: [1, 2]
println!("Middle: {:?}", middle); // 输出: [3, 4, 5, 6]
println!("Last: {:?}", last); // 输出: [7, 8]
// 示例4: 编译时数组合并
const NUMBERS: [i32; 5] = concat_arrays!([1, 2], [3, 4, 5]);
println!("Const array: {:?}", NUMBERS); // 输出: [1, 2, 3, 4, 5]
}
特性
- 数组合并:使用
concat_arrays!
宏可以轻松合并多个数组 - 数组分割:使用
split_array!
宏可以将数组分割为多个部分 - 编译时支持:可以在const上下文中使用
- 非Copy类型支持:支持合并自定义结构体等非Copy类型
- 大小推断:提供
concat_arrays_size!
宏用于计算合并后数组的大小
array-concat库特别适合需要高效处理数组合并和分割的场景,它提供了简洁的宏语法来简化这些常见操作。
1 回复
Rust数组操作库array-concat的使用:高效合并数组与简化集合操作
array-concat
是Rust中一个专注于数组操作的实用库,特别适合需要高效合并数组或进行集合操作的场景。它提供了比标准库更简洁的API来处理数组连接操作。
安装
在Cargo.toml中添加依赖:
[dependencies]
array-concat = "0.1"
主要功能
1. 合并数组
use array_concat::concat;
fn main() {
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let combined = concat!(arr1, arr2);
assert_eq!(combined, [1, 2, 3, 4, 5, 6]);
}
2. 合并多个数组
use array_concat::concat;
fn main() {
let arr1 = [1, 2];
let arr2 = [3, 4];
let arr3 = [5, 6];
let combined = concat!(arr1, arr2, arr3);
assert_eq!(combined, [1, 2, 3, 4, 5, 6]);
}
3. 数组扁平化
use array_concat::concat_arrays;
fn main() {
let arrays = [[1, 2], [3, 4], [5, 6]];
let flattened = concat_arrays!(arrays);
assert_eq!(flattened, [1, 2, 3, 4, 5, 6]);
}
4. 集合操作(去重合并)
use array_concat::concat_uniq;
fn main() {
let arr1 = [1, 2, 3];
let arr2 = [3, 4, 5];
let unique_combined = concat_uniq!(arr1, arr2);
assert_eq!(unique_combined, [1, 2, 3, 4, 5]);
}
性能特点
array-concat
在编译时确定数组大小,避免了动态分配的开销:
- 所有操作都是零成本抽象
- 结果数组大小在编译时确定
- 无运行时检查或panic
高级用法
合并不同类型数组(需实现From trait)
use array_concat::concat;
fn main() {
let arr1 = [1u8, 2, 3];
let arr2 = [4u16, 5, 6];
let combined: [u16; 6] = concat!(arr1, arr2);
assert_eq!(combined, [1, 2, 3, 4, 5, 6]);
}
与const fn结合使用
use array_concat::concat;
const fn create_array() -> [i32; 6] {
concat!([1, 2, 3], [4, 5, 6])
}
fn main() {
const ARR: [i32; 6] = create_array();
assert_eq!(ARR, [1, 2, 3, 4, 5, 6]);
}
完整示例DEMO
下面是一个综合使用array-concat各种功能的完整示例:
// 引入array-concat库的所有宏
use array_concat::{concat, concat_arrays, concat_uniq};
fn main() {
// 示例1: 基本数组合并
let numbers1 = [1, 2, 3];
let numbers2 = [4, 5, 6];
let merged_numbers = concat!(numbers1, numbers2);
println!("合并后的数组: {:?}", merged_numbers); // [1, 2, 3, 4, 5, 6]
// 示例2: 多数组扁平化
let nested_arrays = [[1, 2], [3, 4], [5, 6]];
let flat_array = concat_arrays!(nested_arrays);
println!("扁平化后的数组: {:?}", flat_array); // [1, 2, 3, 4, 5, 6]
// 示例3: 去重合并
let set1 = [1, 2, 3, 3];
let set2 = [3, 4, 5];
let unique_set = concat_uniq!(set1, set2);
println!("去重合并后的数组: {:?}", unique_set); // [1, 2, 3, 4, 5]
// 示例4: 混合类型合并(需要From trait支持)
let u8_array = [1u8, 2, 3];
let u16_array = [4u16, 5, 6];
let mixed_array: [u16; 6] = concat!(u8_array, u16_array);
println!("混合类型合并: {:?}", mixed_array); // [1, 2, 3, 4, 5, 6]
// 示例5: 在常量上下文中使用
const COMBINED: [i32; 6] = concat!([1, 2, 3], [4, 5, 6]);
println!("常量合并数组: {:?}", COMBINED); // [1, 2, 3, 4, 5, 6]
}
array-concat
是处理固定大小数组连接的理想选择,特别适合嵌入式开发或性能敏感场景。