std::list::swap(3)
okay bestie, welcome to std::list::swap(3) from the C++ Standard Libary β yes, we're doing linked-list container swap discourse, and it's lowkey iconic. π¦
π NAME π
std::list::swap β std::list::swap. That's the name, no notes, no extra lore. β¨
β¨ Synopsis β¨
here's the signature tea, exactly as written:
void swap( list& other ); (until C++17)
void swap( list& other ) noexcept(/* see below */); (since C++17)
so what does it do? It exchanges the contents of the container with those of other. It does not invoke any move, copy, or swap operations on individual elements. Not even one. The elements themselves are just chillin'. π
All iterators and references remain valid. But heads up: it is unspecified whether an iterator holding the end() value in this container will refer to this or the other container after the operation. The end() iterator is being mysterious, iykyk. π
allocator tea (since C++11): 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 undefined behavior part is your red flag. π©
π«Ά Parameters π«Ά
otherβ container to exchange the contents with.
π Return value π
(none) β literally no return value. The function is just out here doing the swap and leaving. π«Ά
π Exceptions π
- until C++17:
(none)β no exceptions, she's unbothered. π - since C++17:
noexceptspecification:noexcept(std::allocator_traits<Allocator>::is_always_equal::value)β so the noexcept-ness is conditional, periodt. π₯
π§ Complexity π§
Constant. β that's the whole complexity. no scaling drama. β¨
π Example π
// Run this code β okay, demo time. This is the exact code from the page:
#include <iostream>
#include <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::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 π
and the output is giving:
{ 1 2 3 } { 4 5 } 2 5 1 4
{ 4 5 } { 1 2 3 } 2 5 1 4
π See also π
std::swap(std::list)specializes thestd::swapalgorithm β (function template).
π Category π
* conditionally noexceptβ yes, that's the category, and it's giving conditional noexcept realness. π
that's the page, bestie π β source/version is http://cppreference.com, dated 2024.06.10, and the page is std::list::swap(3). now go swap those lists and stay hydrated. π«Ά
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms