std::unorde...p::operator=(3)

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

πŸ’… std::unorde...p::operator=(3) πŸ’…

okay so welcome to the std::unorde...p::operator=(3) page from the C++ Standard Libary manual β€” yes bestie, that's literally how the manual name is spelled here, and I'm keeping it. This one is all about replacing what's inside your unordered_map. Let's go. ✨


🌸 NAME 🌸

std::unordered_map::operator= - std::unordered_map::operator=

That's the whole name, no cap.


✨ Synopsis ✨

Here's the synopsis energy β€” three overloads, all doing their replacement thing β€” slay:

unordered_map& operator=( const unordered_map& other ); (1) (since C++11)

unordered_map& operator=( unordered_map&& other ); (2) (since C++11) (until C++17)
unordered_map& operator=( unordered_map&& other ) noexcept(/* see below */); (2) (since C++17)

unordered_map& operator=( std::initializer_list<value_type> ilist ); (3) (since C++11)

Replaces the contents of the container. periodt. πŸ’–

Overload (2) is giving main character energy with its noexcept glow-up.


πŸ¦‹ Parameters πŸ¦‹

  • other β€” another container to use as data source
  • ilist β€” initializer list to use as data source

πŸŽ€ Return value πŸŽ€

*this β€” that's the return, bestie. 🫢


πŸ”₯ Complexity πŸ”₯

  1. Linear in the size of *this and other.
  2. Linear in the size of *this unless the allocators do not compare equal and do not propagate, in which case linear in the size of *this and other.
  3. Linear in the size of *this and ilist.

This complexity section ate, ngl.


πŸ’€ Exceptions πŸ’€

  • 1-3) May throw implementation-defined exceptions. (until C++17)
  • 1,3) May throw implementation-defined exceptions.
  • 2) noexcept specification (since C++17):
noexcept(std::allocator_traits<Allocator>::is_always_equal::value
&& std::is_nothrow_move_assignable<Hash>::value
&& std::is_nothrow_move_assignable<Pred>::value)

Lowkey important: that's Allocator, Hash, and Pred exactly as written, iykyk. πŸ”₯


πŸ“ Notes πŸ“

After container move assignment (overload (2)), unless element-wise move assignment is forced by incompatible allocators, references, pointers, and iterators (other than the end iterator) to other remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in [container.reqmts]/67, and a more direct guarantee is under consideration via LWG issue 2321.

The way that guarantee works is iconic, fr fr. Highkey a lot of allocator detail, but it matters.


🌈 Example 🌈

The following code uses operator= to assign one std::unordered_map to another:

// Run this code

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <unordered_map>
#include <utility>

void print(auto const comment, auto const& container)
{
    auto size = std::size(container);
    std::cout << comment << "{ ";
    for (auto const& [key, value] : container)
        std::cout << '{' << key << ',' << value << (--size ? "}, " : "} ");
    std::cout << "}\n";
}

int main()
{
    std::unordered_map<int, int> x{{1,1}, {2,2}, {3,3}}, y, z;
    const auto w = {std::pair<const int, int>{4,4}, {5,5}, {6,6}, {7,7}};

    std::cout << "Initially:\n";
    print("x = ", x);
    print("y = ", y);
    print("z = ", z);

    std::cout << "Copy assignment copies data from x to y:\n";
    y = x;
    print("x = ", x);
    print("y = ", y);

    std::cout << "Move assignment moves data from x to z, modifying both x and z:\n";
    z = std::move(x);
    print("x = ", x);
    print("z = ", z);

    std::cout << "Assignment of initializer_list w to z:\n";
    z = w;
    print("w = ", w);
    print("z = ", z);
}

πŸ’– Possible output πŸ’–

Initially:
x = { {3,3}, {2,2}, {1,1} }
y = { }
z = { }
Copy assignment copies data from x to y:
x = { {3,3}, {2,2}, {1,1} }
y = { {3,3}, {2,2}, {1,1} }
Move assignment moves data from x to z, modifying both x and z:
x = { }
z = { {3,3}, {2,2}, {1,1} }
Assignment of initializer_list w to z:
w = { {4,4}, {5,5}, {6,6}, {7,7} }
z = { {7,7}, {6,6}, {5,5}, {4,4} }

πŸ‘€ See also πŸ‘€

  • constructor β€” constructs the unordered_map (public member function)

Obsessed with a classic constructor cameo.


🧚 Category 🧚

  • conditionally noexcept

Vibe check: conditionally noexcept. πŸŽ€


okay that's the whole page, bestie β€” source is http://cppreference.com, version/date is 2024.06.10, and the page is std::unorde...p::operator=(3). Go forth and assign, slay. πŸ’…βœ¨

πŸ“¦ where this page comes from