17 个版本 (2 个稳定)

2.0.0 2023年5月22日
1.0.0 2022年11月7日
0.8.1 2022年7月21日
0.8.0 2022年3月29日
0.4.0 2021年3月1日

#119 in 数据结构

Download history 1841/week @ 2024-03-14 2101/week @ 2024-03-21 1827/week @ 2024-03-28 2088/week @ 2024-04-04 2296/week @ 2024-04-11 2094/week @ 2024-04-18 1886/week @ 2024-04-25 1739/week @ 2024-05-02 2465/week @ 2024-05-09 1967/week @ 2024-05-16 2153/week @ 2024-05-23 2972/week @ 2024-05-30 2015/week @ 2024-06-06 2915/week @ 2024-06-13 3387/week @ 2024-06-20 2429/week @ 2024-06-27

11,461 每月下载量
用于 40 个crate (5 直接)

MIT/Apache

61KB
1.5K SLoC

常用集合特质

文档 crate信息 仓库

此crate提供了描述数据结构上常见操作的特质。这在构建不依赖于底层数据结构实现的泛型数据结构上的新类型时特别有用。

以下是此crate提供的特质的示例

/// Mutable collection where new elements can be inserted.
pub trait Insert: Collection {
    /// The output of the insertion function.
    type Output;

    /// Insert a new element in the collection.
    fn insert(&mut self, element: Self::Item) -> Self::Output;
}

使用方法

这些特质可以用来定义具有特殊属性的集合,而与实际内部数据结构无关。例如,以下代码定义了一个Ordered<S>堆栈集合,保证了堆栈中元素的良好排序。

use cc_traits::{
    Collection,
    Back,
    PushBack
};

/// Ordered stack.
pub struct Ordered<S> {
    inner: S
}

impl<S> Ordered<S> {
    pub fn new() -> Self where S: Default {
        Ordered {
            inner: S::default()
        }
    }
}

impl<S> Ordered<S> {
    /// Push the given element on the stack iff it is grater or equal
    /// to every other element already in the stack.
    pub fn try_push<T>(&mut self, element: T) -> Result<(), T>
    where
        T: PartialOrd,
        S: Collection<Item=T> + Back + PushBack, // `S` must be a stack providing `back` and `push_back`.
        for<'a> S::ItemRef<'a>: PartialOrd<&'a T> // The reference type must be comparable with other reference types.
    {
        if self.inner.back().map(|back| back <= &element).unwrap_or(true) {
            self.inner.push_back(element);
            Ok(())
        } else {
            Err(element)
        }
    }
}

let mut vec: Ordered<Vec<i32>> = Ordered::new(); // a `Vec` is a stack so it works.

assert!(vec.try_push(1).is_ok());
assert!(vec.try_push(2).is_ok());
assert!(vec.try_push(0).is_err());

use std::collections::VecDeque;
let mut deque: Ordered<VecDeque<i32>> = Ordered::new(); // a `VecDeque` is also a stack.

assert!(deque.try_push(1).is_ok());
assert!(deque.try_push(2).is_ok());
assert!(deque.try_push(0).is_err());

特质别名

通过启用nightly,您可以访问一些特质别名定义,这可以有助于减少代码的冗长。以下是一个这样的别名定义堆栈的常见接口的示例

pub trait Stack<T> = Collection<Item=T> + Len + Back;
pub trait StackMut<T> = Stack<T> + BackMut + PushBack + PopBack;

截至版本0.8.0,这些特质也作为常规特质定义可用,无需nightly功能。

标准库

默认情况下,此crate中定义的所有特质(当相关时)都针对标准库集合实现。您可以使用nostd功能禁用此功能。

外部实现

除了标准库外,如果您启用同名功能,特质还实现了某些流行的crate。以下是一些受支持的crate

  • slab 提供了 Slab 集合。
  • smallvec 提供了 SmallVec 集合。
  • serde_json 提供了 JSON 对象的 Map<String, Value> 集合。
  • ijson 提供了 IObjectIArray 集合。

许可协议

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则任何根据Apache-2.0许可证定义提交以包含在作品中的贡献,都将如上所述双重许可,不附加任何额外条款或条件。

依赖项

~0–445KB