Skip to content

Commit 034ef07

Browse files
committed
doc: TreeSet methods and main example.
1 parent d114dda commit 034ef07

File tree

1 file changed

+183
-16
lines changed

1 file changed

+183
-16
lines changed

src/libcollections/treemap.rs

Lines changed: 183 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ impl<K: Ord, V> Default for TreeMap<K,V> {
138138
}
139139

140140
impl<K: Ord, V> TreeMap<K, V> {
141-
/// Create an empty TreeMap
141+
/// Create an empty `TreeMap`.
142142
pub fn new() -> TreeMap<K, V> { TreeMap{root: None, length: 0} }
143143

144144
/// Get a lazy iterator over the keys in the map.
@@ -232,6 +232,7 @@ impl<K, V> TreeMap<K, V> {
232232
/// Return the value for which `f(key)` returns `Equal`. `f` is invoked
233233
/// with current key and guides tree navigation. That means `f` should
234234
/// be aware of natural ordering of the tree.
235+
///
235236
/// # Example
236237
///
237238
/// ```
@@ -633,15 +634,68 @@ impl<'a, T> Iterator<&'a T> for RevSetItems<'a, T> {
633634
/// ```{rust}
634635
/// use std::collections::TreeSet;
635636
///
636-
/// let mut tree_set = TreeSet::new();
637+
/// let mut set = TreeSet::new();
637638
///
638-
/// tree_set.insert(2i);
639-
/// tree_set.insert(1i);
640-
/// tree_set.insert(3i);
639+
/// set.insert(2i);
640+
/// set.insert(1i);
641+
/// set.insert(3i);
641642
///
642-
/// for i in tree_set.iter() {
643+
/// for i in set.iter() {
643644
/// println!("{}", i) // prints 1, then 2, then 3
644645
/// }
646+
///
647+
/// set.remove(&3);
648+
///
649+
/// if !set.contains(&3) {
650+
/// println!("set does not contain a 3 anymore");
651+
/// }
652+
/// ```
653+
///
654+
/// The easiest way to use `TreeSet` with a custom type is to implement `Ord`.
655+
/// We must also implement `PartialEq`, `Eq` and `PartialOrd`.
656+
///
657+
/// ```
658+
/// use std::collections::TreeSet;
659+
///
660+
/// // We need `Eq` and `PartialEq`, these can be derived.
661+
/// #[deriving(Eq, PartialEq)]
662+
/// struct Troll<'a> {
663+
/// name: &'a str,
664+
/// level: uint,
665+
/// }
666+
///
667+
/// // Implement `Ord` and sort trolls by level.
668+
/// impl<'a> Ord for Troll<'a> {
669+
/// fn cmp(&self, other: &Troll) -> Ordering {
670+
/// // If we swap `self` and `other`, we get descended ordering.
671+
/// self.level.cmp(&other.level)
672+
/// }
673+
/// }
674+
///
675+
/// // `PartialOrd` needs to be implemented as well.
676+
/// impl<'a> PartialOrd for Troll<'a> {
677+
/// fn partial_cmp(&self, other: &Troll) -> Option<Ordering> {
678+
/// Some(self.cmp(other))
679+
/// }
680+
/// }
681+
///
682+
/// let mut trolls = TreeSet::new();
683+
///
684+
/// trolls.insert(Troll { name: "Orgarr", level: 2 });
685+
/// trolls.insert(Troll { name: "Blargarr", level: 3 });
686+
/// trolls.insert(Troll { name: "Kron the Smelly One", level: 4 });
687+
/// trolls.insert(Troll { name: "Wartilda", level: 1 });
688+
///
689+
/// println!("You are facing {} trolls!", trolls.len());
690+
///
691+
/// // Print the trolls, ordered by level with smallest level first
692+
/// for x in trolls.iter() {
693+
/// println!("level {}: {}!", x.level, x.name);
694+
/// }
695+
///
696+
/// // Kill all trolls
697+
/// trolls.clear();
698+
/// assert_eq!(trolls.len(), 0);
645699
/// ```
646700
#[deriving(Clone)]
647701
pub struct TreeSet<T> {
@@ -732,25 +786,66 @@ impl<T: Ord> Default for TreeSet<T> {
732786
}
733787

734788
impl<T: Ord> TreeSet<T> {
735-
/// Create an empty TreeSet
789+
/// Create an empty `TreeSet`.
790+
///
791+
/// # Example
792+
///
793+
/// ```
794+
/// use std::collections::TreeSet;
795+
/// let mut set: TreeSet<int> = TreeSet::new();
796+
/// ```
736797
#[inline]
737798
pub fn new() -> TreeSet<T> { TreeSet{map: TreeMap::new()} }
738799

739-
/// Get a lazy iterator over the values in the set.
740-
/// Requires that it be frozen (immutable).
800+
/// Get a lazy iterator over the values in the set, in ascending order.
801+
///
802+
/// # Example
803+
///
804+
/// ```
805+
/// use std::collections::TreeSet;
806+
/// let set: TreeSet<int> = [1i, 4, 3, 5, 2].iter().map(|&x| x).collect();
807+
///
808+
/// // Will print in ascending order.
809+
/// for x in set.iter() {
810+
/// println!("{}", x);
811+
/// }
812+
/// ```
741813
#[inline]
742814
pub fn iter<'a>(&'a self) -> SetItems<'a, T> {
743815
SetItems{iter: self.map.iter()}
744816
}
745817

746-
/// Get a lazy iterator over the values in the set.
747-
/// Requires that it be frozen (immutable).
818+
/// Get a lazy iterator over the values in the set, in descending order.
819+
///
820+
/// # Example
821+
///
822+
/// ```
823+
/// use std::collections::TreeSet;
824+
/// let set: TreeSet<int> = [1i, 4, 3, 5, 2].iter().map(|&x| x).collect();
825+
///
826+
/// // Will print in descending order.
827+
/// for x in set.rev_iter() {
828+
/// println!("{}", x);
829+
/// }
830+
/// ```
748831
#[inline]
749832
pub fn rev_iter<'a>(&'a self) -> RevSetItems<'a, T> {
750833
RevSetItems{iter: self.map.rev_iter()}
751834
}
752835

753-
/// Get a lazy iterator that consumes the set.
836+
/// Creates a consuming iterator, that is, one that moves each value out of the
837+
/// set in ascending order. The set cannot be used after calling this.
838+
///
839+
/// # Example
840+
///
841+
/// ```
842+
/// use std::collections::TreeSet;
843+
/// let set: TreeSet<int> = [1i, 4, 3, 5, 2].iter().map(|&x| x).collect();
844+
///
845+
/// // Not possible with a regular `.iter()`
846+
/// let v: Vec<int> = set.move_iter().collect();
847+
/// assert_eq!(v, vec![1, 2, 3, 4, 5]);
848+
/// ```
754849
#[inline]
755850
pub fn move_iter(self) -> MoveSetItems<T> {
756851
self.map.move_iter().map(|(value, _)| value)
@@ -770,24 +865,96 @@ impl<T: Ord> TreeSet<T> {
770865
SetItems{iter: self.map.upper_bound(v)}
771866
}
772867

773-
/// Visit the values (in-order) representing the difference
868+
/// Visit the values representing the difference, in ascending order.
869+
///
870+
/// # Example
871+
///
872+
/// ```
873+
/// use std::collections::TreeSet;
874+
/// let a: TreeSet<int> = [1, 2, 3].iter().map(|&x| x).collect();
875+
/// let b: TreeSet<int> = [3, 4, 5].iter().map(|&x| x).collect();
876+
///
877+
/// // Can be seen as `a - b`.
878+
/// for x in a.difference(&b) {
879+
/// println!("{}", x); // Print 1 then 2
880+
/// }
881+
///
882+
/// let diff: TreeSet<int> = a.difference(&b).map(|&x| x).collect();
883+
/// assert_eq!(diff, [1, 2].iter().map(|&x| x).collect());
884+
///
885+
/// // Note that difference is not symmetric,
886+
/// // and `b - a` means something else:
887+
/// let diff: TreeSet<int> = b.difference(&a).map(|&x| x).collect();
888+
/// assert_eq!(diff, [4, 5].iter().map(|&x| x).collect());
889+
/// ```
774890
pub fn difference<'a>(&'a self, other: &'a TreeSet<T>) -> DifferenceItems<'a, T> {
775891
DifferenceItems{a: self.iter().peekable(), b: other.iter().peekable()}
776892
}
777893

778-
/// Visit the values (in-order) representing the symmetric difference
894+
/// Visit the values representing the symmetric difference, in ascending order.
895+
///
896+
/// # Example
897+
///
898+
/// ```
899+
/// use std::collections::TreeSet;
900+
/// let a: TreeSet<int> = [1, 2, 3].iter().map(|&x| x).collect();
901+
/// let b: TreeSet<int> = [3, 4, 5].iter().map(|&x| x).collect();
902+
///
903+
/// // Print 1, 2, 4, 5 in ascending order.
904+
/// for x in a.symmetric_difference(&b) {
905+
/// println!("{}", x);
906+
/// }
907+
///
908+
/// let diff1: TreeSet<int> = a.symmetric_difference(&b).map(|&x| x).collect();
909+
/// let diff2: TreeSet<int> = b.symmetric_difference(&a).map(|&x| x).collect();
910+
///
911+
/// assert_eq!(diff1, diff2);
912+
/// assert_eq!(diff1, [1, 2, 4, 5].iter().map(|&x| x).collect());
913+
/// ```
779914
pub fn symmetric_difference<'a>(&'a self, other: &'a TreeSet<T>)
780915
-> SymDifferenceItems<'a, T> {
781916
SymDifferenceItems{a: self.iter().peekable(), b: other.iter().peekable()}
782917
}
783918

784-
/// Visit the values (in-order) representing the intersection
919+
/// Visit the values representing the intersection, in ascending order.
920+
///
921+
/// # Example
922+
///
923+
/// ```
924+
/// use std::collections::TreeSet;
925+
/// let a: TreeSet<int> = [1, 2, 3].iter().map(|&x| x).collect();
926+
/// let b: TreeSet<int> = [2, 3, 4].iter().map(|&x| x).collect();
927+
///
928+
/// // Print 2, 3 in ascending order.
929+
/// for x in a.intersection(&b) {
930+
/// println!("{}", x);
931+
/// }
932+
///
933+
/// let diff: TreeSet<int> = a.intersection(&b).map(|&x| x).collect();
934+
/// assert_eq!(diff, [2, 3].iter().map(|&x| x).collect());
935+
/// ```
785936
pub fn intersection<'a>(&'a self, other: &'a TreeSet<T>)
786937
-> IntersectionItems<'a, T> {
787938
IntersectionItems{a: self.iter().peekable(), b: other.iter().peekable()}
788939
}
789940

790-
/// Visit the values (in-order) representing the union
941+
/// Visit the values representing the union, in ascending order.
942+
///
943+
/// # Example
944+
///
945+
/// ```
946+
/// use std::collections::HashSet;
947+
/// let a: HashSet<int> = [1, 2, 3].iter().map(|&x| x).collect();
948+
/// let b: HashSet<int> = [3, 4, 5].iter().map(|&x| x).collect();
949+
///
950+
/// // Print 1, 2, 3, 4, 5 in ascending order.
951+
/// for x in a.union(&b) {
952+
/// println!("{}", x);
953+
/// }
954+
///
955+
/// let diff: HashSet<int> = a.union(&b).map(|&x| x).collect();
956+
/// assert_eq!(diff, [1, 2, 3, 4, 5].iter().map(|&x| x).collect());
957+
/// ```
791958
pub fn union<'a>(&'a self, other: &'a TreeSet<T>) -> UnionItems<'a, T> {
792959
UnionItems{a: self.iter().peekable(), b: other.iter().peekable()}
793960
}

0 commit comments

Comments
 (0)