Skip to content

Commit a03287b

Browse files
committed
BTreeSet::from_iter: use bulk building to improve the performance
Apply the same optimization as BTreeMap::from_iter.
1 parent cf814d6 commit a03287b

File tree

1 file changed

+22
-5
lines changed
  • library/alloc/src/collections/btree

1 file changed

+22
-5
lines changed

library/alloc/src/collections/btree/set.rs

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// This is pretty much entirely stolen from TreeSet, since BTreeMap has an identical interface
22
// to TreeMap
33

4+
use crate::vec::Vec;
45
use core::borrow::Borrow;
56
use core::cmp::Ordering::{Equal, Greater, Less};
67
use core::cmp::{max, min};
@@ -1059,9 +1060,17 @@ impl<T> BTreeSet<T> {
10591060
#[stable(feature = "rust1", since = "1.0.0")]
10601061
impl<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

Comments
 (0)