Spec-Zone.ru › C++

std::multimap<Key,T,Compare,Allocator>::operator=

multimap& operator=( const multimap& other );
(1)
(2)
multimap& operator=( multimap&& other );
(с C++11)
(до C++17)
multimap& operator=( multimap&& other ) noexcept(/* see below */);
(с C++17)
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, могут быть либо уничтожены, либо заменены присваиванием по элементам.

(с C++11)
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) O(NlogN) в общем случае, где N — size() + ilist.size(). Линейная, если ilist отсортирован по отношению к value_comp().

Исключения

Может выбросить исключения, определённые реализацией.

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

Примечания

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

Пример

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

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

Вывод:

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

См. также

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

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

Spec-Zone.ru

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