Struct std::collections::BTreeSet 1.0.0[−][src]
pub struct BTreeSet<T> { /* fields omitted */ }
Expand description
基于 B 树的集合。
有关此集合的性能优缺点的详细讨论,请参见 BTreeMap
文档。
以某种方式修改项目是一种逻辑错误,即该项目相对于任何其他项目的排序 (由 Ord
trait 确定) 会在其位于集合中时发生变化。
通常只有通过 Cell
,RefCell
,二进制状态,I/O 或不安全代码才能实现此操作。
未指定由此类逻辑错误导致的行为,但不会导致未定义的行为。
这可能包括 panics,不正确的结果,异常终止,内存泄漏和未终止。
Examples
use std::collections::BTreeSet; // 通过类型推断,我们可以省略显式类型签名 (在本示例中为 `BTreeSet<&str>`)。 let mut books = BTreeSet::new(); // 添加一些书。 books.insert("A Dance With Dragons"); books.insert("To Kill a Mockingbird"); books.insert("The Odyssey"); books.insert("The Great Gatsby"); // 检查一个特定的。 if !books.contains("The Winds of Winter") { println!("We have {} books, but The Winds of Winter ain't one.", books.len()); } // 删除一本书。 books.remove("The Odyssey"); // 遍历所有内容。 for book in &books { println!("{}", book); }Run
Implementations
在集合中元素的子范围上创建一个双端迭代器。
最简单的方法是使用范围语法 min..max
,因此 range(min..max)
将产生从最小 (inclusive) 到最大 (exclusive) 的元素。
也可以将范围输入为 (Bound<T>, Bound<T>)
,例如 range((Excluded(4), Included(10)))
将产生一个左排他的,范围从 4 到 10。
Examples
use std::collections::BTreeSet; use std::ops::Bound::Included; let mut set = BTreeSet::new(); set.insert(3); set.insert(5); set.insert(8); for &elem in set.range((Included(&4), Included(&8))) { println!("{}", elem); } assert_eq!(Some(&5), set.range(4..).next());Run
pub fn difference(&'a self, other: &'a BTreeSet<T>) -> Difference<'a, T>ⓘNotable traits for Difference<'a, T>impl<'a, T> Iterator for Difference<'a, T> where
T: Ord, type Item = &'a T;
where
T: Ord,
[src]
pub fn difference(&'a self, other: &'a BTreeSet<T>) -> Difference<'a, T>ⓘNotable traits for Difference<'a, T>impl<'a, T> Iterator for Difference<'a, T> where
T: Ord, type Item = &'a T;
where
T: Ord,
[src]impl<'a, T> Iterator for Difference<'a, T> where
T: Ord, type Item = &'a T;
pub fn symmetric_difference(
&'a self,
other: &'a BTreeSet<T>
) -> SymmetricDifference<'a, T>ⓘNotable traits for SymmetricDifference<'a, T>impl<'a, T> Iterator for SymmetricDifference<'a, T> where
T: Ord, type Item = &'a T;
where
T: Ord,
[src]
pub fn symmetric_difference(
&'a self,
other: &'a BTreeSet<T>
) -> SymmetricDifference<'a, T>ⓘNotable traits for SymmetricDifference<'a, T>impl<'a, T> Iterator for SymmetricDifference<'a, T> where
T: Ord, type Item = &'a T;
where
T: Ord,
[src]impl<'a, T> Iterator for SymmetricDifference<'a, T> where
T: Ord, type Item = &'a T;
pub fn intersection(&'a self, other: &'a BTreeSet<T>) -> Intersection<'a, T>ⓘNotable traits for Intersection<'a, T>impl<'a, T> Iterator for Intersection<'a, T> where
T: Ord, type Item = &'a T;
where
T: Ord,
[src]
pub fn intersection(&'a self, other: &'a BTreeSet<T>) -> Intersection<'a, T>ⓘNotable traits for Intersection<'a, T>impl<'a, T> Iterator for Intersection<'a, T> where
T: Ord, type Item = &'a T;
where
T: Ord,
[src]impl<'a, T> Iterator for Intersection<'a, T> where
T: Ord, type Item = &'a T;
如果 self
与 other
没有共同的元素,则返回 true
。
这等效于检查空的交点。
Examples
use std::collections::BTreeSet; let a: BTreeSet<_> = [1, 2, 3].iter().cloned().collect(); let mut b = BTreeSet::new(); assert_eq!(a.is_disjoint(&b), true); b.insert(4); assert_eq!(a.is_disjoint(&b), true); b.insert(1); assert_eq!(a.is_disjoint(&b), false);Run
如果集合是另一个集合的子集,则返回 true
,即 other
至少包含 self
中的所有值。
Examples
use std::collections::BTreeSet; let sup: BTreeSet<_> = [1, 2, 3].iter().cloned().collect(); let mut set = BTreeSet::new(); assert_eq!(set.is_subset(&sup), true); set.insert(2); assert_eq!(set.is_subset(&sup), true); set.insert(4); assert_eq!(set.is_subset(&sup), false);Run
如果集合是另一个集合的超集,则返回 true
,即 self
至少包含 other
中的所有值。
Examples
use std::collections::BTreeSet; let sub: BTreeSet<_> = [1, 2].iter().cloned().collect(); let mut set = BTreeSet::new(); assert_eq!(set.is_superset(&sub), false); set.insert(0); set.insert(1); assert_eq!(set.is_superset(&sub), false); set.insert(2); assert_eq!(set.is_superset(&sub), true);Run
向集合中添加一个值。
如果集合中不存在该值,则返回 true
。
如果集合中确实存在该值,则返回 false
,并且不会更新该条目。
有关更多信息,请参见 module-level documentation。
Examples
use std::collections::BTreeSet; let mut set = BTreeSet::new(); assert_eq!(set.insert(2), true); assert_eq!(set.insert(2), false); assert_eq!(set.len(), 1);Run
将所有元素从 other
移到 Self
,将 other
留空。
Examples
use std::collections::BTreeSet; let mut a = BTreeSet::new(); a.insert(1); a.insert(2); a.insert(3); let mut b = BTreeSet::new(); b.insert(3); b.insert(4); b.insert(5); a.append(&mut b); assert_eq!(a.len(), 5); assert_eq!(b.len(), 0); assert!(a.contains(&1)); assert!(a.contains(&2)); assert!(a.contains(&3)); assert!(a.contains(&4)); assert!(a.contains(&5));Run
按照给定的值将集合一分为二。 返回给定值之后的所有内容,包括该值。
Examples
基本用法:
use std::collections::BTreeSet; let mut a = BTreeSet::new(); a.insert(1); a.insert(2); a.insert(3); a.insert(17); a.insert(41); let b = a.split_off(&3); assert_eq!(a.len(), 2); assert_eq!(b.len(), 3); assert!(a.contains(&1)); assert!(a.contains(&2)); assert!(b.contains(&3)); assert!(b.contains(&17)); assert!(b.contains(&41));Run
pub fn drain_filter<'a, F>(&'a mut self, pred: F) -> DrainFilter<'a, T, F>ⓘNotable traits for DrainFilter<'_, T, F>impl<'a, '_, T, F> Iterator for DrainFilter<'_, T, F> where
F: 'a + FnMut(&T) -> bool, type Item = T;
where
F: 'a + FnMut(&T) -> bool,
T: Ord,
[src]
pub fn drain_filter<'a, F>(&'a mut self, pred: F) -> DrainFilter<'a, T, F>ⓘNotable traits for DrainFilter<'_, T, F>impl<'a, '_, T, F> Iterator for DrainFilter<'_, T, F> where
F: 'a + FnMut(&T) -> bool, type Item = T;
where
F: 'a + FnMut(&T) -> bool,
T: Ord,
[src]impl<'a, '_, T, F> Iterator for DrainFilter<'_, T, F> where
F: 'a + FnMut(&T) -> bool, type Item = T;
创建一个按升序访问所有值的迭代器,并使用闭包来确定是否应删除某个值。
如果闭包返回 true
,则该值将从集合中移除并产生。如果闭包返回 false
或 panics,则该值保留在集合中,不会产生。
如果迭代器只被部分使用或完全没有使用,则每个剩余的值仍然受闭包的影响,如果返回 true
,则删除和删除。
如果在闭包中出现 panic,或者在丢弃值时出现 panic,或者 DrainFilter
本身被泄漏,那么还有多少值将被关闭,这是未指定的。
Examples
将一个集合分为偶数和奇数值,重新使用原始集合:
#![feature(btree_drain_filter)] use std::collections::BTreeSet; let mut set: BTreeSet<i32> = (0..8).collect(); let evens: BTreeSet<_> = set.drain_filter(|v| v % 2 == 0).collect(); let odds = set; assert_eq!(evens.into_iter().collect::<Vec<_>>(), vec![0, 2, 4, 6]); assert_eq!(odds.into_iter().collect::<Vec<_>>(), vec![1, 3, 5, 7]);Run
获取一个迭代器,该迭代器以升序访问 BTreeSet
中的值。
Examples
use std::collections::BTreeSet; let set: BTreeSet<usize> = [1, 2, 3].iter().cloned().collect(); let mut set_iter = set.iter(); assert_eq!(set_iter.next(), Some(&1)); assert_eq!(set_iter.next(), Some(&2)); assert_eq!(set_iter.next(), Some(&3)); assert_eq!(set_iter.next(), None);Run
迭代器返回的值以升序返回:
use std::collections::BTreeSet; let set: BTreeSet<usize> = [3, 1, 2].iter().cloned().collect(); let mut set_iter = set.iter(); assert_eq!(set_iter.next(), Some(&1)); assert_eq!(set_iter.next(), Some(&2)); assert_eq!(set_iter.next(), Some(&3)); assert_eq!(set_iter.next(), None);Run
Trait Implementations
将 self
和 rhs
的交集返回为新的 BTreeSet<T>
。
Examples
use std::collections::BTreeSet; let a: BTreeSet<_> = vec![1, 2, 3].into_iter().collect(); let b: BTreeSet<_> = vec![2, 3, 4].into_iter().collect(); let result = &a & &b; let result_vec: Vec<_> = result.into_iter().collect(); assert_eq!(result_vec, [2, 3]);Run
返回 self
和 rhs
的并集作为新的 BTreeSet<T>
。
Examples
use std::collections::BTreeSet; let a: BTreeSet<_> = vec![1, 2, 3].into_iter().collect(); let b: BTreeSet<_> = vec![3, 4, 5].into_iter().collect(); let result = &a | &b; let result_vec: Vec<_> = result.into_iter().collect(); assert_eq!(result_vec, [1, 2, 3, 4, 5]);Run
返回 self
和 rhs
的对称差作为新的 BTreeSet<T>
。
Examples
use std::collections::BTreeSet; let a: BTreeSet<_> = vec![1, 2, 3].into_iter().collect(); let b: BTreeSet<_> = vec![2, 3, 4].into_iter().collect(); let result = &a ^ &b; let result_vec: Vec<_> = result.into_iter().collect(); assert_eq!(result_vec, [1, 4]);Run
从迭代器创建一个值。 Read more
type Item = T
type Item = T
被迭代的元素的类型。
将 self
和 rhs
之差作为新的 BTreeSet<T>
返回。
Examples
use std::collections::BTreeSet; let a: BTreeSet<_> = vec![1, 2, 3].into_iter().collect(); let b: BTreeSet<_> = vec![3, 4, 5].into_iter().collect(); let result = &a - &b; let result_vec: Vec<_> = result.into_iter().collect(); assert_eq!(result_vec, [1, 2]);Run