#ring #queue #deque #circular #double-ended #reuse #double-ended-queue

ring_queue

使用向量实现的双端队列,元素移除后可以重复使用空间

2个不稳定版本

使用旧的Rust 2015

0.2.0 2018年12月24日
0.1.0 2018年12月10日

数据结构 中排名 2185

每月下载量 30
循环数据类型 中使用

MIT 许可证

30KB
545

ring_queue 构建状态 文档 crates.io 许可证: MIT

使用向量实现的双端队列,元素移除后可以重复使用空间。

API 设计灵感主要来源于 Python 的 collections.deque

可以使用任何可用的构造函数或 ring! 宏来创建环形队列。

#[macro_use] extern crate ring_queue;

use ring_queue::Ring;

// `new` for an empty ring.
let r: Ring<i32> = Ring::new();

// `with_capacity` for allocating the internal vector with the given
// capacity.
let r2: Ring<i32> = Ring::with_capacity(5);

// `ring!` macro for easy initializing the ring.
let r3: Ring<i32> = ring![1, 2, 3];

// `from_iter` to construct the ring from an iterator.
use std::iter::FromIterator;
let r4: Ring<i32> = Ring::from_iter(vec![1, 2, 3]);

不同于 frontback 的命名法,此库使用 left 来指代前部,没有名称来指代后部,就像 Python 的 collections.deque 库一样。

元素可以被推到左侧和右侧,也可以弹出。

#[macro_use] extern crate ring_queue;

use ring_queue::Ring;

let mut r = ring![1, 2, 3];
r.push(4);
r.push_left(0);
assert_eq!(r.pop(), Some(4));
assert_eq!(r.pop_left(), Some(0));

环形队列可以左转或右转。任何正数都会将 n 步旋转到右侧,任何负数都会将 n 步旋转到左侧。

#[macro_use] extern crate ring_queue;

use ring_queue::Ring;

let mut r = ring![1, 2, 3, 4, 5];

r.rotate(1);
assert_eq!(r.collect_vec(), vec![5, 1, 2, 3, 4]);

r.rotate(-2);
assert_eq!(r.collect_vec(), vec![2, 3, 4, 5, 1]);

环形队列实现了 collect,如果元素类型实现了 Copy 特性,则可以将环形队列中的元素收集为向量。

#[macro_use] extern crate ring_queue;

use ring_queue::Ring;

let mut r = ring![1, 2, 3, 4];
assert_eq!(r.collect_vec(), vec![1, 2, 3, 4]);

它还实现了 into_iter 来生成一个迭代器。然而,如果元素没有实现 Copy 特性,则 into_iter 会清空环形队列。

#[macro_use] extern crate ring_queue;

use ring_queue::Ring;

// Since integers implement Copy, an iterator over this ring will not
// consume the ring itself.
let r = ring![1, 2, 3, 4];
assert_eq!(r.is_empty(), false);

for item in r.into_iter() {
    println!("{}", item);
}

assert_eq!(r.is_empty(), false);

// Element is Vec<{integer}>, so it's not copyable. An iterator for this
// ring will empty the ring.
let mut r2 = ring![vec![1, 2], vec![3, 4]];

for item in r2.into_iter() {
    println!("{:?}", item);
}

assert_eq!(r2.is_empty(), true);

许可证

MIT 许可证,见 LICENSE

无运行时依赖