11// This is pretty much entirely stolen from TreeSet, since BTreeMap has an identical interface
22// to TreeMap
33
4+ use crate :: vec:: Vec ;
45use core:: borrow:: Borrow ;
56use core:: cmp:: Ordering :: { Equal , Greater , Less } ;
67use core:: cmp:: { max, min} ;
@@ -1059,9 +1060,17 @@ impl<T> BTreeSet<T> {
10591060#[ stable( feature = "rust1" , since = "1.0.0" ) ]
10601061impl < T : Ord > FromIterator < T > for BTreeSet < T > {
10611062 fn from_iter < I : IntoIterator < Item = T > > ( iter : I ) -> BTreeSet < T > {
1062- let mut set = BTreeSet :: new ( ) ;
1063- set. extend ( iter) ;
1064- set
1063+ let mut inputs: Vec < _ > = iter. into_iter ( ) . collect ( ) ;
1064+
1065+ if inputs. is_empty ( ) {
1066+ return BTreeSet :: new ( ) ;
1067+ }
1068+
1069+ // use stable sort to preserve the insertion order.
1070+ inputs. sort ( ) ;
1071+ let iter = inputs. into_iter ( ) . map ( |k| ( k, ( ) ) ) ;
1072+ let map = BTreeMap :: bulk_build_from_sorted_iter ( iter) ;
1073+ BTreeSet { map }
10651074 }
10661075}
10671076
@@ -1074,8 +1083,16 @@ impl<T: Ord, const N: usize> From<[T; N]> for BTreeSet<T> {
10741083 /// let set2: BTreeSet<_> = [1, 2, 3, 4].into();
10751084 /// assert_eq!(set1, set2);
10761085 /// ```
1077- fn from ( arr : [ T ; N ] ) -> Self {
1078- core:: array:: IntoIter :: new ( arr) . collect ( )
1086+ fn from ( mut arr : [ T ; N ] ) -> Self {
1087+ if N == 0 {
1088+ return BTreeSet :: new ( ) ;
1089+ }
1090+
1091+ // use stable sort to preserve the insertion order.
1092+ arr. sort ( ) ;
1093+ let iter = core:: array:: IntoIter :: new ( arr) . map ( |k| ( k, ( ) ) ) ;
1094+ let map = BTreeMap :: bulk_build_from_sorted_iter ( iter) ;
1095+ BTreeSet { map }
10791096 }
10801097}
10811098
0 commit comments