std::erase,...std::deque)(3)

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

okay so bestie, welcome to the std::erase,...std::deque)(3) page from the C++ Standard Libary manual (yes, β€˜Libary’ β€” the typo is canon, we don’t fix it πŸ’…). This is all about std::erase and std::erase_if for std::deque, and I’m gonna walk you through it like we’re in the group chat. No cap, every detail is here. ✨

✨ NAME ✨

std::erase, std::erase_if (std::deque) β€” the dynamic duo for wiping elements out of a std::deque. Literally their whole personality. 🫢

🌸 Synopsis 🌸

Defined in header <deque> β€” got it? πŸ’–

So there are like three overloads / versions, and the vibes are:

template< class T, class Alloc, class U >                        (since C++20) (until C++26)
std::deque<T, Alloc>::size_type
erase( std::deque<T, Alloc>& c, const U& value );

template< class T, class Alloc, class U = T >                    (1) (since C++26)
std::deque<T, Alloc>::size_type
erase( std::deque<T, Alloc>& c, const U& value );

template< class T, class Alloc, class Pred >                     (2) (since C++20)
std::deque<T, Alloc>::size_type
erase_if( std::deque<T, Alloc>& c, Pred pred );

Okay so overload (1) is the erase one, and overload (2) is the erase_if one. Slay. πŸ’…

Now the tea β˜•:

  1. Erases all elements that compare equal to value from the container. Equivalent to:
auto it = std::remove(c.begin(), c.end(), value);
auto r = c.end() - it;
c.erase(it, c.end());
return r;
  1. Erases all elements that satisfy the predicate pred from the container. Equivalent to:
auto it = std::remove_if(c.begin(), c.end(), pred);
auto r = c.end() - it;
c.erase(it, c.end());
return r;

πŸŽ€ Parameters πŸŽ€

  • c β€” container from which to erase. The main character. πŸ‘‘
  • value β€” value to be removed. Bye bestie. πŸ‘‹
  • pred β€” unary predicate which returns true if the element should be erased. The expression pred(v) must be convertible to bool for every argument v of type (possibly const) T, regardless of value category, and must not modify v. Thus, a parameter type of T& is not allowed, nor is T unless for T a move is equivalent to a copy (since C++11). No cap, that’s the rule. 😭

πŸ”₯ Return value πŸ”₯

The number of erased elements. Literally just a count of how many got yeeted. πŸ—‘οΈ

🌈 Complexity 🌈

Linear. So it’s giving O(n) but make it fashion. ✨

πŸ‘‘ Notes πŸ‘‘

Here’s the feature-test macro tea:

  • Feature-test macro: __cpp_lib_algorithm_default_value_type
  • Value: 202403
  • Std: (C++26)
  • Feature: List-initialization for algorithm (1)

πŸ’– Example πŸ’–

Okay so run this code, bestie:

// Run this code

#include <complex>
#include <iostream>
#include <numeric>
#include <string_view>
#include <deque>

void println(std::string_view comment, const auto& c)
{
    std::cout << comment << "{ ";
    for (const auto& x : c)
        std::cout << x << ' ';
    std::cout << "}\n";
}

int main()
{
    std::deque<char> cnt(10);
    std::iota(cnt.begin(), cnt.end(), '0');
    println("Initially, cnt = ", cnt);

    std::erase(cnt, '3');
    println("After erase '3', cnt = ", cnt);

    auto erased = std::erase_if(cnt, [](char x) { return (x - '0') % 2
== 0; });
    println("After erase all even numbers, cnt = ", cnt);
    std::cout << "Erased even numbers: " << erased << '\n';

    std::deque<std::complex<double>> nums{{2, 2}, {4, 2}, {4, 8}, {4,
2}};
    #ifdef __cpp_lib_algorithm_default_value_type
        std::erase(nums, {4, 2});
    #else
        std::erase(nums, std::complex<double>{4, 2});
    #endif
    println("After erase {4, 2}, nums = ", nums);
}

πŸ¦‹ Output πŸ¦‹

Initially, cnt = { 0 1 2 3 4 5 6 7 8 9 }
After erase '3', cnt = { 0 1 2 4 5 6 7 8 9 }
After erase all even numbers, cnt = { 1 5 7 9 }
Erased even numbers: 5
After erase {4, 2}, nums = { (2,2) (4,8) }

🌟 See also 🌟

  • remove β€” removes elements satisfying specific criteria
  • remove_if (function template)

πŸ’– source: http://cppreference.com β€’ date: 2024.06.10 β€’ page: std::erase,...std::deque)(3) πŸ’–

That’s the whole vibe. Now go erase some elements, bestie. Periodt. πŸ’…βœ¨

πŸ“¦ where this page comes from