std::vector::erase(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

✨ std::vector::erase(3) β€” C++ Standard Libary πŸŽ€

okay so bestie, this is the std::vector::erase(3) page from the C++ Standard Libary, and it is literally here to teach you how to remove elements from a std::vector without causing absolute chaos. no cap. πŸ’…


πŸ’– NAME πŸ’–

std::vector::erase β€” std::vector::erase (yes, the NAME section is serving self-referential main character energy ✨)


🌸 Synopsis 🌸

iterator erase( iterator pos );                    (until C++11)
iterator erase( const_iterator pos );              (since C++11)
                                                   (constexpr since C++20)
iterator erase( iterator first, iterator last );   (1) (until C++11)
iterator erase( const_iterator first, const_iterator last ); (2) (since C++11)
                                                   (constexpr since C++20)

Erases the specified elements from the container. iconic behavior, honestly.

  1. Removes the element at pos.
  2. Removes the elements in the range [first, last).
🚨 vibe check / danger alert: iterators (including the end() iterator) and references to the elements at or after the point of the erase are invalidated. do not touch them after, bestie. 😭

The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos. fr fr.

The iterator first does not need to be dereferenceable if first == last: erasing an empty range is a no-op. slay, no drama.


🧚 Parameters 🧚

  • pos β€” iterator to the element to remove.
  • first, last β€” range of elements to remove.

πŸŽ€ Type requirements πŸŽ€

  • T must meet the requirements of MoveAssignable.

πŸ”₯ Return value πŸ”₯

Iterator following the last removed element. that's the return vibe, okay?

  1. If pos refers to the last element, then the end() iterator is returned.
  2. If last == end() prior to removal, then the updated end() iterator is returned. If [first, last) is an empty range, then last is returned.

πŸ’€ Exceptions πŸ’€

Does not throw unless an exception is thrown by the assignment operator of T. so if T's assignment operator starts acting up, that is the exception tea. πŸ«–


🌈 Complexity 🌈

Linear: the number of calls to the destructor of T is the same as the number of elements erased, the assignment operator of T is called the number of times equal to the number of elements in the vector after the erased elements. it's giving linear, bestie. ⭐


πŸ¦‹ Notes πŸ¦‹

When container elements need to be erased based on a predicate, rather than iterating the container and calling unary erase, the iterator range overload is generally used with std::remove()/std::remove_if() to minimise the number of moves of the remaining (non-removed) elements, this is the erase-remove idiom. iykyk.

std::erase_if() replaces the erase-remove idiom. (since C++20) periodt.


πŸ’– Example πŸ’–

run this code, bestie β€” it is the exact example from the page:

// Run this code

#include <vector>
#include <iostream>

void print_container(const std::vector<int>& c)
{
    for (int i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}

int main()
{
    std::vector<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    print_container(c);

    c.erase(c.begin());
    print_container(c);

    c.erase(c.begin() + 2, c.begin() + 5);
    print_container(c);

    // Erase all even numbers
    for (std::vector<int>::iterator it = c.begin(); it != c.end();)
    {
        if (*it % 2 == 0)
            it = c.erase(it);
        else
            ++it;
    }
    print_container(c);
}

✨ Output ✨

0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 6 7 8 9
1 7 9

πŸŽ€ Defect reports πŸŽ€

The following behavior-changing defect reports were applied retroactively to previously published C++ standards β€” yes, the receipts go back, bestie:

  • DR LWG 151, applied to C++98: behavior as published β€” first was required to be dereferenceable, which made the behavior of clearing an empty vector undefined; correct behavior β€” not required if first == last.
  • DR LWG 414, applied to C++98: behavior as published β€” iterators at the point of erase were not invalidated; correct behavior β€” they are also invalidated.

🌟 See also 🌟

  • erase(std::vector) β€” erases all elements satisfying specific criteria.
  • erase_if(std::vector) β€” (function template) (C++20).
  • clear β€” clears the contents (public member function).

πŸ’– source: http://cppreference.com Β· version/date: 2024.06.10 Β· page: std::vector::erase(3) β€” bye bestie, go erase responsibly! 🫢✨

πŸ“¦ where this page comes from