@@ -138,7 +138,7 @@ impl<K: Ord, V> Default for TreeMap<K,V> {
138
138
}
139
139
140
140
impl < K : Ord , V > TreeMap < K , V > {
141
- /// Create an empty TreeMap
141
+ /// Create an empty ` TreeMap`.
142
142
pub fn new ( ) -> TreeMap < K , V > { TreeMap { root : None , length : 0 } }
143
143
144
144
/// Get a lazy iterator over the keys in the map.
@@ -232,6 +232,7 @@ impl<K, V> TreeMap<K, V> {
232
232
/// Return the value for which `f(key)` returns `Equal`. `f` is invoked
233
233
/// with current key and guides tree navigation. That means `f` should
234
234
/// be aware of natural ordering of the tree.
235
+ ///
235
236
/// # Example
236
237
///
237
238
/// ```
@@ -633,15 +634,68 @@ impl<'a, T> Iterator<&'a T> for RevSetItems<'a, T> {
633
634
/// ```{rust}
634
635
/// use std::collections::TreeSet;
635
636
///
636
- /// let mut tree_set = TreeSet::new();
637
+ /// let mut set = TreeSet::new();
637
638
///
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);
641
642
///
642
- /// for i in tree_set .iter() {
643
+ /// for i in set .iter() {
643
644
/// println!("{}", i) // prints 1, then 2, then 3
644
645
/// }
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);
645
699
/// ```
646
700
#[ deriving( Clone ) ]
647
701
pub struct TreeSet < T > {
@@ -732,25 +786,66 @@ impl<T: Ord> Default for TreeSet<T> {
732
786
}
733
787
734
788
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
+ /// ```
736
797
#[ inline]
737
798
pub fn new ( ) -> TreeSet < T > { TreeSet { map : TreeMap :: new ( ) } }
738
799
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
+ /// ```
741
813
#[ inline]
742
814
pub fn iter < ' a > ( & ' a self ) -> SetItems < ' a , T > {
743
815
SetItems { iter : self . map . iter ( ) }
744
816
}
745
817
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
+ /// ```
748
831
#[ inline]
749
832
pub fn rev_iter < ' a > ( & ' a self ) -> RevSetItems < ' a , T > {
750
833
RevSetItems { iter : self . map . rev_iter ( ) }
751
834
}
752
835
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
+ /// ```
754
849
#[ inline]
755
850
pub fn move_iter ( self ) -> MoveSetItems < T > {
756
851
self . map . move_iter ( ) . map ( |( value, _) | value)
@@ -770,24 +865,96 @@ impl<T: Ord> TreeSet<T> {
770
865
SetItems { iter : self . map . upper_bound ( v) }
771
866
}
772
867
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
+ /// ```
774
890
pub fn difference < ' a > ( & ' a self , other : & ' a TreeSet < T > ) -> DifferenceItems < ' a , T > {
775
891
DifferenceItems { a : self . iter ( ) . peekable ( ) , b : other. iter ( ) . peekable ( ) }
776
892
}
777
893
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
+ /// ```
779
914
pub fn symmetric_difference < ' a > ( & ' a self , other : & ' a TreeSet < T > )
780
915
-> SymDifferenceItems < ' a , T > {
781
916
SymDifferenceItems { a : self . iter ( ) . peekable ( ) , b : other. iter ( ) . peekable ( ) }
782
917
}
783
918
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
+ /// ```
785
936
pub fn intersection < ' a > ( & ' a self , other : & ' a TreeSet < T > )
786
937
-> IntersectionItems < ' a , T > {
787
938
IntersectionItems { a : self . iter ( ) . peekable ( ) , b : other. iter ( ) . peekable ( ) }
788
939
}
789
940
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
+ /// ```
791
958
pub fn union < ' a > ( & ' a self , other : & ' a TreeSet < T > ) -> UnionItems < ' a , T > {
792
959
UnionItems { a : self . iter ( ) . peekable ( ) , b : other. iter ( ) . peekable ( ) }
793
960
}
0 commit comments