Skip to content

Commit

Permalink
Rollup merge of rust-lang#102507 - scottmcm:more-binary-search-docs, …
Browse files Browse the repository at this point in the history
…r=m-ou-se

More slice::partition_point examples

After seeing the discussion of `binary_search` vs `partition_point` in rust-lang#101999, I thought some more example code could be helpful.
  • Loading branch information
matthiaskrgr committed Oct 18, 2022
2 parents 410e0b2 + 5b9a02a commit d34ab5c
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions library/core/src/slice/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2359,6 +2359,28 @@ impl<T> [T] {
/// assert!(match r { Ok(1..=4) => true, _ => false, });
/// ```
///
/// If you want to find that whole *range* of matching items, rather than
/// an arbitrary matching one, that can be done using [`partition_point`]:
/// ```
/// let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
///
/// let low = s.partition_point(|x| x < &1);
/// assert_eq!(low, 1);
/// let high = s.partition_point(|x| x <= &1);
/// assert_eq!(high, 5);
/// let r = s.binary_search(&1);
/// assert!((low..high).contains(&r.unwrap()));
///
/// assert!(s[..low].iter().all(|&x| x < 1));
/// assert!(s[low..high].iter().all(|&x| x == 1));
/// assert!(s[high..].iter().all(|&x| x > 1));
///
/// // For something not found, the "range" of equal items is empty
/// assert_eq!(s.partition_point(|x| x < &11), 9);
/// assert_eq!(s.partition_point(|x| x <= &11), 9);
/// assert_eq!(s.binary_search(&11), Err(9));
/// ```
///
/// If you want to insert an item to a sorted vector, while maintaining
/// sort order, consider using [`partition_point`]:
///
Expand Down Expand Up @@ -3787,6 +3809,16 @@ impl<T> [T] {
/// assert!(v[i..].iter().all(|&x| !(x < 5)));
/// ```
///
/// If all elements of the slice match the predicate, including if the slice
/// is empty, then the length of the slice will be returned:
///
/// ```
/// let a = [2, 4, 8];
/// assert_eq!(a.partition_point(|x| x < &100), a.len());
/// let a: [i32; 0] = [];
/// assert_eq!(a.partition_point(|x| x < &100), 0);
/// ```
///
/// If you want to insert an item to a sorted vector, while maintaining
/// sort order:
///
Expand Down

0 comments on commit d34ab5c

Please sign in to comment.