1
1
// This is pretty much entirely stolen from TreeSet, since BTreeMap has an identical interface
2
2
// to TreeMap
3
3
4
+ use crate :: vec:: Vec ;
4
5
use core:: borrow:: Borrow ;
5
6
use core:: cmp:: Ordering :: { Equal , Greater , Less } ;
6
7
use core:: cmp:: { max, min} ;
@@ -1059,9 +1060,17 @@ impl<T> BTreeSet<T> {
1059
1060
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1060
1061
impl < T : Ord > FromIterator < T > for BTreeSet < T > {
1061
1062
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 }
1065
1074
}
1066
1075
}
1067
1076
@@ -1074,8 +1083,16 @@ impl<T: Ord, const N: usize> From<[T; N]> for BTreeSet<T> {
1074
1083
/// let set2: BTreeSet<_> = [1, 2, 3, 4].into();
1075
1084
/// assert_eq!(set1, set2);
1076
1085
/// ```
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 }
1079
1096
}
1080
1097
}
1081
1098
0 commit comments