diff options
| author | bors <bors@rust-lang.org> | 2022-06-09 10:17:04 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-06-09 10:17:04 +0000 |
| commit | be16c6166f08f9b26d854783bbd4ce8d006c8f6f (patch) | |
| tree | c63f2fba20a31ef9099a82321137d694fa870b84 /library | |
| parent | 6dc598a01b8f7619826b7152be5162e6d37a1754 (diff) | |
| parent | 49ccb7519f55bd117d2ab50b7a030637f380aec6 (diff) | |
| download | rust-be16c6166f08f9b26d854783bbd4ce8d006c8f6f.tar.gz rust-be16c6166f08f9b26d854783bbd4ce8d006c8f6f.zip | |
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.
Diffstat (limited to 'library')
| -rw-r--r-- | library/alloc/src/collections/btree/set.rs | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/library/alloc/src/collections/btree/set.rs b/library/alloc/src/collections/btree/set.rs index caa629cf4e6..31655c11807 100644 --- a/library/alloc/src/collections/btree/set.rs +++ b/library/alloc/src/collections/btree/set.rs @@ -1093,7 +1093,13 @@ impl<T: Ord> FromIterator<T> for BTreeSet<T> { // use stable sort to preserve the insertion order. inputs.sort(); - let iter = inputs.into_iter().map(|k| (k, ())); + BTreeSet::from_sorted_iter(inputs.into_iter()) + } +} + +impl<T: Ord> BTreeSet<T> { + fn from_sorted_iter<I: Iterator<Item = T>>(iter: I) -> BTreeSet<T> { + let iter = iter.map(|k| (k, ())); let map = BTreeMap::bulk_build_from_sorted_iter(iter); BTreeSet { map } } @@ -1258,11 +1264,10 @@ impl<T: Ord + Clone> Sub<&BTreeSet<T>> for &BTreeSet<T> { /// let b = BTreeSet::from([3, 4, 5]); /// /// let result = &a - &b; - /// let result_vec: Vec<_> = result.into_iter().collect(); - /// assert_eq!(result_vec, [1, 2]); + /// assert_eq!(result, BTreeSet::from([1, 2])); /// ``` fn sub(self, rhs: &BTreeSet<T>) -> BTreeSet<T> { - self.difference(rhs).cloned().collect() + BTreeSet::from_sorted_iter(self.difference(rhs).cloned()) } } @@ -1281,11 +1286,10 @@ impl<T: Ord + Clone> BitXor<&BTreeSet<T>> for &BTreeSet<T> { /// let b = BTreeSet::from([2, 3, 4]); /// /// let result = &a ^ &b; - /// let result_vec: Vec<_> = result.into_iter().collect(); - /// assert_eq!(result_vec, [1, 4]); + /// assert_eq!(result, BTreeSet::from([1, 4])); /// ``` fn bitxor(self, rhs: &BTreeSet<T>) -> BTreeSet<T> { - self.symmetric_difference(rhs).cloned().collect() + BTreeSet::from_sorted_iter(self.symmetric_difference(rhs).cloned()) } } @@ -1304,11 +1308,10 @@ impl<T: Ord + Clone> BitAnd<&BTreeSet<T>> for &BTreeSet<T> { /// let b = BTreeSet::from([2, 3, 4]); /// /// let result = &a & &b; - /// let result_vec: Vec<_> = result.into_iter().collect(); - /// assert_eq!(result_vec, [2, 3]); + /// assert_eq!(result, BTreeSet::from([2, 3])); /// ``` fn bitand(self, rhs: &BTreeSet<T>) -> BTreeSet<T> { - self.intersection(rhs).cloned().collect() + BTreeSet::from_sorted_iter(self.intersection(rhs).cloned()) } } @@ -1327,11 +1330,10 @@ impl<T: Ord + Clone> BitOr<&BTreeSet<T>> for &BTreeSet<T> { /// let b = BTreeSet::from([3, 4, 5]); /// /// let result = &a | &b; - /// let result_vec: Vec<_> = result.into_iter().collect(); - /// assert_eq!(result_vec, [1, 2, 3, 4, 5]); + /// assert_eq!(result, BTreeSet::from([1, 2, 3, 4, 5])); /// ``` fn bitor(self, rhs: &BTreeSet<T>) -> BTreeSet<T> { - self.union(rhs).cloned().collect() + BTreeSet::from_sorted_iter(self.union(rhs).cloned()) } } |
