C/C++ Arena

Step 3 of 6

Insert and erase

Adding or removing elements in the middle of a vector uses iterators: objects that mark a position in a container. You'll study them in depth later; for now:

#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> steps = {"wake", "coffee", "work"};
    steps.insert(steps.begin() + 1, "shower");
    steps.insert(steps.end(), "sleep");
    steps.erase(steps.begin() + 2);
    for (const auto& s : steps) std::cout << s << " ";
    std::cout << "(" << steps.size() << ")\n";
}
wake shower work sleep (4)

Cost

Because elements are contiguous, inserting or erasing in the middle must move every element after that position: O(n). Adding or removing at the end is fast (O(1)). If you do lots of middle insertions on big data, a different container may fit better, but for most sizes a vector is still the fastest choice, because moving contiguous memory is very quick.

Validate positions

erase and insert don't check their positions: erasing v.begin() + 10 in a 3-element vector is undefined behavior. When an index comes from outside, check 0 <= i and i < v.size() first (converting carefully between int and the unsigned size()).

Your task

Write void remove_at(std::vector<std::string>& v, int i) that removes element i if it's a valid index and does nothing otherwise.

Challenge 2

Write void insert_at(std::vector<std::string>& v, int i, const std::string& s) that inserts s so it ends up at index i. Valid positions are 0 up to v.size() (which appends at the end); for any other i, do nothing.

Challenge 3

Write void remove_all(std::vector<int>& v, int x) that removes every element equal to x, keeping the others in order. Erasing inside a loop is easy to get wrong: after erase, the next element moves into the current index.

Previous: Loop over a vector Next: 2D vectors