Przejdź do głównej zawartości

std::multimap operator=

// (1) Non const version only
multimap& operator=( const multimap& other );

// (2) Non const version only
multimap& operator=( multimap&& other ) noexcept(/* see below */);

// (3) Non const version only
multimap& operator=( std::initializer_list<value_type> ilist );

Replaces the contents of the containter.

Parameters

  • other - another container to use as data source
  • ilist - initializer list to use as data source

Return value

A reference to the container, *this.

Exceptions

  • (1, 3) May throw implementation-defined exceptions.
  • (2) noexcept specification:
    noexcept(std::allocator_traits<Allocator>::is_always_equal::value
    && std::is_nothrow_move_assignable<Compare>::value)

Complexity

  • (1) Linear in the size of *this and other - O(size() + other.size()).
  • (2)
    Linear in the size of *this - O(size()). If the allocators do not compare equal and do not propagate - linear in the size of *this and other - O(size() + other.
  • (3)
    O(N log N) in general, where N is size() + ilist.size(). Linear if ilist is sorted with respect to value_comp() - O(size()).

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.requirements.general]/12, and a more direct guarantee is under consideration via LWG 2321.

Example

Main.cpp
#include <map>
#include <iterator>
#include <iostream>
#include <utility>
#include <initializer_list>

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} }
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.

std::multimap operator=

// (1) Non const version only
multimap& operator=( const multimap& other );

// (2) Non const version only
multimap& operator=( multimap&& other ) noexcept(/* see below */);

// (3) Non const version only
multimap& operator=( std::initializer_list<value_type> ilist );

Replaces the contents of the containter.

Parameters

  • other - another container to use as data source
  • ilist - initializer list to use as data source

Return value

A reference to the container, *this.

Exceptions

  • (1, 3) May throw implementation-defined exceptions.
  • (2) noexcept specification:
    noexcept(std::allocator_traits<Allocator>::is_always_equal::value
    && std::is_nothrow_move_assignable<Compare>::value)

Complexity

  • (1) Linear in the size of *this and other - O(size() + other.size()).
  • (2)
    Linear in the size of *this - O(size()). If the allocators do not compare equal and do not propagate - linear in the size of *this and other - O(size() + other.
  • (3)
    O(N log N) in general, where N is size() + ilist.size(). Linear if ilist is sorted with respect to value_comp() - O(size()).

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.requirements.general]/12, and a more direct guarantee is under consideration via LWG 2321.

Example

Main.cpp
#include <map>
#include <iterator>
#include <iostream>
#include <utility>
#include <initializer_list>

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} }
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.