std::forward_list::swap(3)

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

πŸ’– std::forward_list::swap(3) πŸ’–

okay bestie, welcome to the C++ Standard Libary page for std::forward_list::swap β€” yes, that's β€œLibary” with one B up in the header, we don't make the rules 😭. This is the (3) manual page, and it's giving β€œswap two forward lists without touching the individual elements” energy. Slay.


🌸 NAME 🌸

std::forward_list::swap β€” std::forward_list::swap


✨ Synopsis ✨

Two flavors, depending on your C++ era, bestie:

void swap( forward_list& other );                            (since C++11)
                                                              (until C++17)
void swap( forward_list& other ) noexcept(/* see below */);  (since C++17)

So here's the vibe: it exchanges the contents of the container with those of other. It does not invoke any move, copy, or swap operations on individual elements. No cap.

All iterators and references remain valid. It is unspecified whether an iterator holding the end() value in this container will refer to this or the other container after the operation. iykyk.

If std::allocator_traits<allocator_type>::propagate_on_container_swap::value is true, then the allocators are exchanged using an unqualified call to non-member swap. Otherwise, they are not swapped (and if get_allocator() != other.get_allocator(), the behavior is undefined). That allocator bit is (since C++11), bestie.

⚠️ undefined behavior warning: if get_allocator() != other.get_allocator() and the allocators are not swapped, the behavior is undefined. Do not play with that πŸ’€.

πŸŽ€ Parameters πŸŽ€

  • other β€” container to exchange the contents with

πŸ¦‹ Return value πŸ¦‹

(none) β€” that's it, no return value, no drama πŸ’….


🌸 Exceptions 🌸

  • (none) β€” (until C++17)
  • noexcept specification: (since C++17)
noexcept(std::allocator_traits<Allocator>::is_always_equal::value)

πŸ’… Complexity πŸ’…

Constant. periodt.


πŸ”₯ Example πŸ”₯

// Run this code

#include <iostream>
#include <forward_list>

template<class Os, class Co>
Os& operator<<(Os& os, const Co& co)
{
    os << '{';
    for (auto const& i : co)
        os << ' ' << i;
    return os << " } ";
}

int main()
{
    std::forward_list<int> a1{1, 2, 3}, a2{4, 5};

    auto it1 = std::next(a1.begin());
    auto it2 = std::next(a2.begin());

    int& ref1 = a1.front();
    int& ref2 = a2.front();

    std::cout << a1 << a2 << *it1 << ' ' << *it2 << ' ' << ref1 << ' ' << ref2 << '\n';
    a1.swap(a2);
    std::cout << a1 << a2 << *it1 << ' ' << *it2 << ' ' << ref1 << ' ' << ref2 << '\n';

    // Note that after swap the iterators and references stay associated with their
    // original elements, e.g. it1 that pointed to an element in 'a1' with value 2
    // still points to the same element, though this element was moved into 'a2'.
}

⭐ Output ⭐

{ 1 2 3 } { 4 5 } 2 5 1 4
{ 4 5 } { 1 2 3 } 2 5 1 4

🌈 See also 🌈

  • std::swap(std::forward_list) specializes the std::swap algorithm (C++11) β€” (function template)

πŸ‘‘ Category πŸ‘‘

  • * conditionally noexcept

mwah πŸ’‹ source/version: http://cppreference.com Β· date: 2024.06.10 β€” that's the cute sign-off, bestie 🫢

πŸ“¦ where this page comes from