std::multimap::operator=(3)
π std::multimap::operator=(3) β C++ Standard Library, bestie edition
okay so this is the std::multimap assignment operators, literally the "copy this whole vibe into that container" page π«Ά it lives in the C++ Standard Library and it's giving very much "how do I make one multimap become another one" energy. Buckle up.
β¨ Synopsis β¨
multimap& operator=( const multimap& other ); (1)
multimap& operator=( multimap&& other ); (2) (since C++11) (until C++17)
multimap& operator=( multimap&& other )
noexcept(/* see below */); (2) (since C++17)
multimap& operator=( std::initializer_list<value_type> ilist ); (3) (since C++11)
the whole point, the entire reason this page exists: Replaces the contents of the container. periodt π
(1)the copy assignment operator β swoops in and replaces your contents with a copy of the contents ofother. classic.- but okay, here's the tea π if
std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::valueistrue, then the allocator of*thisis replaced by a copy ofother's allocator. and if the allocator of*thisafter assignment would compare unequal to its old value, the old allocator is used to deallocate the memory, then the new allocator is used to allocate it before copying the elements (since C++11). otherwise, the memory owned by*thismay be reused when possible. in any case β either way bestie β the elements originally belonging to*thismay be either destroyed or replaced by element-wise copy-assignment. so don't be out here holding references like nothing's gonna change π
- but okay, here's the tea π if
(2)the move assignment operator β replaces the contents with those ofotherusing move semantics (i.e. the data inotheris moved fromotherinto this container). andotheris left in a valid but unspecified state afterwards β she's not destroyed, she's just... going through something π- if
std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::valueistrue, the allocator of*thisis replaced by a copy of that ofother. - if it's
falseand the allocators of*thisandotherdo not compare equal,*thiscannot take ownership of the memory owned byotherand must move-assign each element individually, allocating additional memory using its own allocator as needed. the sad slow path, we hate to see it π - in any case, all elements originally belonging to
*thisare either destroyed or replaced by element-wise move-assignment.
- if
(3)replaces the contents with those identified by initializer listilist. cute, concise, iconic β¨
πΈ Parameters πΈ
otherβ another container to use as data sourceilistβ initializer list to use as data source
π Return value π
*this β she returns herself, main character energy π
π₯ Complexity π₯
- Linear in the size of
*thisandother. - Linear in the size of
*thisunless the allocators do not compare equal and do not propagate, in which case linear in the size of*thisandother. O(NlogN)in general, whereNissize() + ilist.size(). Linear ifilistis sorted with respect tovalue_comp(). (see, sorting pays off, who knew π)
π 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<Compare>::value)
π¦ 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 they refer to elements that are now in *this. like, they moved out but kept their address, it's giving long-distance relationship π§
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. (iykyk, standards drama π)
β Example β
The following code uses operator= to assign one std::multimap to another:
// Run this code
#include <initializer_list>
#include <iostream>
#include <iterator>
#include <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::multimap<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);
}
π Output π
Initially:
x = { {1,1}, {2,2}, {3,3} }
y = { }
z = { }
Copy assignment copies data from x to y:
x = { {1,1}, {2,2}, {3,3} }
y = { {1,1}, {2,2}, {3,3} }
Move assignment moves data from x to z, modifying both x and z:
x = { }
z = { {1,1}, {2,2}, {3,3} }
Assignment of initializer_list w to z:
w = { {4,4}, {5,5}, {6,6}, {7,7} }
z = { {4,4}, {5,5}, {6,6}, {7,7} }
notice how x got absolutely emptied out by the move β she gave everything she had, no cap ππ
π See also π
constructorβ constructs the multimap (public member function)
π Category π
*conditionallynoexcept
lowkey a warning before you go: the copy-assignment path can destroy or element-wise copy-assign the elements that were already in*this, and after a move those references/pointers/iterators still point at stuff β but the stuff now lives in*this. do not come for me if your iterator is confused, I warned you bestie π«Ά
and that's the page, fr fr β sourced from http://cppreference.com, dated 2024.06.10, filed under std::multimap::operator=(3). slay, go assign some maps π
β¨π
π¦ 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