Skip to content

Commit af3d6ec

Browse files
authored
Unrolled build for rust-lang#121262
Rollup merge of rust-lang#121262 - 20jasper:add-vector-time-complexity, r=cuviper Add vector time complexity Added time complexity for `Vec` methods `push`, `push_within_capacity`, `pop`, and `insert`. <details> <summary> Reference images </summary> ![`Vec::push` documentation](https://github.com/rust-lang/rust/assets/78604367/dc966bbd-e92e-45a6-af82-35afabfa79a9) ![`Vec::push_within_capacity` documentation](https://github.com/rust-lang/rust/assets/78604367/9aadaf48-46ed-4fad-bdd5-74b98a61f4bb) ![`Vec::pop` documentation](https://github.com/rust-lang/rust/assets/78604367/88ec0389-a346-4ea5-a3b7-17caf514dd8b) ![`Vec::insert` documentation](https://github.com/rust-lang/rust/assets/78604367/960c15c3-ef8e-4aa7-badc-35ce80f6f221) </details> I followed a convention to use `#Time complexity` that I found in [the `BinaryHeap` documentation](https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#time-complexity-1). Looking through the rest of standard library collections, there is not a consistent way to handle this. [`Vec::swap_remove`](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.swap_remove) does not have a dedicated section for time complexity but does list it. [`VecDeque::rotate_left`](https://doc.rust-lang.org/std/collections/struct.VecDeque.html#complexity) uses a `#complexity` heading.
2 parents 5a1e544 + 74151cb commit af3d6ec

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

library/alloc/src/vec/mod.rs

+21
Original file line numberDiff line numberDiff line change
@@ -1490,6 +1490,12 @@ impl<T, A: Allocator> Vec<T, A> {
14901490
/// vec.insert(4, 5);
14911491
/// assert_eq!(vec, [1, 4, 2, 3, 5]);
14921492
/// ```
1493+
///
1494+
/// # Time complexity
1495+
///
1496+
/// Takes *O*([`Vec::len`]) time. All items after the insertion index must be
1497+
/// shifted to the right. In the worst case, all elements are shifted when
1498+
/// the insertion index is 0.
14931499
#[cfg(not(no_global_oom_handling))]
14941500
#[stable(feature = "rust1", since = "1.0.0")]
14951501
pub fn insert(&mut self, index: usize, element: T) {
@@ -1913,6 +1919,13 @@ impl<T, A: Allocator> Vec<T, A> {
19131919
/// vec.push(3);
19141920
/// assert_eq!(vec, [1, 2, 3]);
19151921
/// ```
1922+
///
1923+
/// # Time complexity
1924+
///
1925+
/// Takes amortized *O*(1) time. If the vector's length would exceed its
1926+
/// capacity after the push, *O*(*capacity*) time is taken to copy the
1927+
/// vector's elements to a larger allocation. This expensive operation is
1928+
/// offset by the *capacity* *O*(1) insertions it allows.
19161929
#[cfg(not(no_global_oom_handling))]
19171930
#[inline]
19181931
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1961,6 +1974,10 @@ impl<T, A: Allocator> Vec<T, A> {
19611974
/// }
19621975
/// assert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
19631976
/// ```
1977+
///
1978+
/// # Time complexity
1979+
///
1980+
/// Takes *O*(1) time.
19641981
#[inline]
19651982
#[unstable(feature = "vec_push_within_capacity", issue = "100486")]
19661983
pub fn push_within_capacity(&mut self, value: T) -> Result<(), T> {
@@ -1990,6 +2007,10 @@ impl<T, A: Allocator> Vec<T, A> {
19902007
/// assert_eq!(vec.pop(), Some(3));
19912008
/// assert_eq!(vec, [1, 2]);
19922009
/// ```
2010+
///
2011+
/// # Time complexity
2012+
///
2013+
/// Takes *O*(1) time.
19932014
#[inline]
19942015
#[stable(feature = "rust1", since = "1.0.0")]
19952016
pub fn pop(&mut self) -> Option<T> {

0 commit comments

Comments
 (0)