-
Notifications
You must be signed in to change notification settings - Fork 14k
Description
The Vec type currently provides an push method that allows one to insert a single element at the end of the vector, as well as push_all and push_all_move methods that allow inserting many elements at the end of the vector more efficiently than would happen if the client code called push in a loop (because it avoids repeatedly re-growing the vector).
Vec also offers an insert method that allows inserting a single element somewhere in the innards of the vector.
I believe we could usefully add insert_all and insert_all_move methods that insert a sequence of elements at once. These methods would:
- Reserve the necessary space,
- Shift over all of the pre-existing elements to make room,
- Copy in the new values.
Caveat: we would need to ensure that fail! does not occur between steps 2 and 3.
Much like with push_all/push_all_move, the advantage would be avoiding repeatedly re-growing the vector, the way that calling insert in a loop will do.
(The insert_all and insert_all_move may have to have their own dedicated implementations, rather than being layed atop an iterator-based abstraction the way that push_all/push_all_move are atop Extendable::extend, because of the caveat given above (we cannot call out to arbitrary iterator code during step 3 because we cannot allow failure while the vector is in an intermediate state where it has partially blank innards).
I am filing this mostly as a note because while I was working on #15418, I found a potential need for methods like these to avoid quadratic asymptotic runtimes. But it is probably not a high priority.