Skip to content

Commit be16c61

Browse files
committed
Auto merge of #97868 - ssomers:btree_from_sorted_iter, r=the8472
BTreeSet: avoid intermediate sorting when collecting sorted iterators As [pointed out by droundy](https://users.rust-lang.org/t/question-about-btreeset-implementation/76427), an obvious optimization is to skip the first step introduced by #88448 (creation of a vector and sorting) and it's easy to do so for btree's own iterators. Also, exploit `from` in the examples.
2 parents 6dc598a + 49ccb75 commit be16c61

File tree

1 file changed

+15
-13
lines changed
  • library/alloc/src/collections/btree

1 file changed

+15
-13
lines changed

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

+15-13
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,13 @@ impl<T: Ord> FromIterator<T> for BTreeSet<T> {
10931093

10941094
// use stable sort to preserve the insertion order.
10951095
inputs.sort();
1096-
let iter = inputs.into_iter().map(|k| (k, ()));
1096+
BTreeSet::from_sorted_iter(inputs.into_iter())
1097+
}
1098+
}
1099+
1100+
impl<T: Ord> BTreeSet<T> {
1101+
fn from_sorted_iter<I: Iterator<Item = T>>(iter: I) -> BTreeSet<T> {
1102+
let iter = iter.map(|k| (k, ()));
10971103
let map = BTreeMap::bulk_build_from_sorted_iter(iter);
10981104
BTreeSet { map }
10991105
}
@@ -1258,11 +1264,10 @@ impl<T: Ord + Clone> Sub<&BTreeSet<T>> for &BTreeSet<T> {
12581264
/// let b = BTreeSet::from([3, 4, 5]);
12591265
///
12601266
/// let result = &a - &b;
1261-
/// let result_vec: Vec<_> = result.into_iter().collect();
1262-
/// assert_eq!(result_vec, [1, 2]);
1267+
/// assert_eq!(result, BTreeSet::from([1, 2]));
12631268
/// ```
12641269
fn sub(self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
1265-
self.difference(rhs).cloned().collect()
1270+
BTreeSet::from_sorted_iter(self.difference(rhs).cloned())
12661271
}
12671272
}
12681273

@@ -1281,11 +1286,10 @@ impl<T: Ord + Clone> BitXor<&BTreeSet<T>> for &BTreeSet<T> {
12811286
/// let b = BTreeSet::from([2, 3, 4]);
12821287
///
12831288
/// let result = &a ^ &b;
1284-
/// let result_vec: Vec<_> = result.into_iter().collect();
1285-
/// assert_eq!(result_vec, [1, 4]);
1289+
/// assert_eq!(result, BTreeSet::from([1, 4]));
12861290
/// ```
12871291
fn bitxor(self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
1288-
self.symmetric_difference(rhs).cloned().collect()
1292+
BTreeSet::from_sorted_iter(self.symmetric_difference(rhs).cloned())
12891293
}
12901294
}
12911295

@@ -1304,11 +1308,10 @@ impl<T: Ord + Clone> BitAnd<&BTreeSet<T>> for &BTreeSet<T> {
13041308
/// let b = BTreeSet::from([2, 3, 4]);
13051309
///
13061310
/// let result = &a & &b;
1307-
/// let result_vec: Vec<_> = result.into_iter().collect();
1308-
/// assert_eq!(result_vec, [2, 3]);
1311+
/// assert_eq!(result, BTreeSet::from([2, 3]));
13091312
/// ```
13101313
fn bitand(self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
1311-
self.intersection(rhs).cloned().collect()
1314+
BTreeSet::from_sorted_iter(self.intersection(rhs).cloned())
13121315
}
13131316
}
13141317

@@ -1327,11 +1330,10 @@ impl<T: Ord + Clone> BitOr<&BTreeSet<T>> for &BTreeSet<T> {
13271330
/// let b = BTreeSet::from([3, 4, 5]);
13281331
///
13291332
/// let result = &a | &b;
1330-
/// let result_vec: Vec<_> = result.into_iter().collect();
1331-
/// assert_eq!(result_vec, [1, 2, 3, 4, 5]);
1333+
/// assert_eq!(result, BTreeSet::from([1, 2, 3, 4, 5]));
13321334
/// ```
13331335
fn bitor(self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
1334-
self.union(rhs).cloned().collect()
1336+
BTreeSet::from_sorted_iter(self.union(rhs).cloned())
13351337
}
13361338
}
13371339

0 commit comments

Comments
 (0)