Spec-Zone.ru › C++

std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>::operator=

unordered_multimap& operator=( const unordered_multimap& other );
(1) (начиная с C++11)
unordered_multimap& operator=( unordered_multimap&& other );
(2) (начиная с C++11)
(до C++17)
unordered_multimap& operator=( unordered_multimap&& other ) noexcept(/* see below */);
(начиная с C++17)
unordered_multimap& operator=( std::initializer_list<value_type> ilist );
(3) (начиная с C++11)

Заменяет содержимое контейнера.

1) Оператор копирующего присваивания. Заменяет содержимое копией содержимого other.
Если std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value равно true, аллокатор *this заменяется копией other. Если после присваивания аллокатор *this будет не равен своему прежнему значению, для освобождения памяти используется старый аллокатор, а затем новый аллокатор используется для её выделения перед копированием элементов. В противном случае при возможности может быть повторно использована память, принадлежащая *this. В любом случае элементы, изначально принадлежавшие *this, могут быть уничтожены или заменены поэлементным копирующим присваиванием.
2) Оператор перемещающего присваивания. Заменяет содержимое содержимым other, используя семантику перемещения (то есть данные в other перемещаются из other в этот контейнер). После этого other находится в допустимом, но не определённом состоянии.
Если std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value равно true, аллокатор *this заменяется копией аллокатора other. Если оно равно false, а аллокаторы *this и other не равны, *this не может получить во владение память, принадлежащую other, и должен переместить каждый элемент по отдельности, при необходимости выделяя дополнительную память с помощью собственного аллокатора. В любом случае все элементы, изначально принадлежавшие *this, уничтожаются или заменяются поэлементным перемещающим присваиванием.
3) Заменяет содержимое элементами из списка инициализации ilist.

Параметры

other - другой контейнер, используемый в качестве источника данных
ilist - список инициализации, используемый в качестве источника данных

Возвращаемое значение

*this

Сложность

1) Линейная относительно размера *this и other.
2) Линейная относительно размера *this, если аллокаторы не равны и не распространяются; в этом случае сложность линейная относительно размера *this и other.
3) Линейная относительно размера *this и ilist.

Исключения

1-3) Может выбрасывать исключения, определяемые реализацией. (до C++17)
1,3) Может выбрасывать исключения, определяемые реализацией. 2)
noexcept спецификация:
noexcept(std::allocator_traits<Allocator>::is_always_equal::value
&& std::is_nothrow_move_assignable<Hash>::value
&& std::is_nothrow_move_assignable<Pred>::value)
(начиная с C++17)

Примечания

После перемещающего присваивания контейнера (перегрузка (2)), если несовместимые аллокаторы не вынуждают выполнять поэлементное перемещающее присваивание, ссылки, указатели и итераторы, изначально указывавшие на элементы в other, остаются действительными, но теперь указывают на элементы в *this. В действующем стандарте эта гарантия обеспечивается общим положением в [container.reqmts]/67; рассматривается возможность более прямого закрепления этой гарантии в вопросе LWG 2321.

Пример

В следующем коде используется operator= для присваивания одного std::unordered_multimap другому:

#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_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);
}

Возможный вывод:

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} }

См. также

(конструктор)
создаёт unordered_multimap
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/unordered_multimap/operator%3D

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API