Namespaces
Variants

std::unordered_set<Key,Hash,KeyEqual,Allocator>:: operator=

From cppreference.net

unordered_set & operator = ( const unordered_set & other ) ;
(1) (начиная с C++11)
(constexpr начиная с C++26)
(2)
unordered_set & operator = ( unordered_set && other ) ;
(начиная с C++11)
(до C++17)
unordered_set & operator = ( unordered_set && other )
noexcept ( /* см. ниже */ ) ;
(начиная с C++17)
(constexpr начиная с C++26)
unordered_set & operator = ( std:: initializer_list < value_type > ilist ) ;
(3) (начиная с C++11)
(constexpr начиная с C++26)

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

Пусть traits будет std:: allocator_traits < allocator_type > :

1) Оператор копирующего присваивания. Заменяет содержимое копией содержимого other .
Если traits :: propagate_on_container_copy_assignment :: value равно true , аллокатор * this заменяется копией аллокатора other . Если после присваивания аллокатор * this будет сравниваться как неравный своему старому значению, старый аллокатор используется для освобождения памяти, после чего новый аллокатор используется для её выделения перед копированием элементов. В противном случае память, принадлежащая * this , может быть повторно использована, когда это возможно. В любом случае, элементы, изначально принадлежавшие * this , могут быть либо уничтожены, либо заменены через поэлементное копирующее присваивание.
2) Оператор перемещающего присваивания. Заменяет содержимое на содержимое other используя семантику перемещения (т.е. данные из other перемещаются в этот контейнер). other после этого находится в допустимом, но неопределённом состоянии.
Если traits :: 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 .

Исключения

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 issue 2321 .

Пример

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

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <unordered_set>
void print(const auto comment, const auto& container)
{
    auto size = std::size(container);
    std::cout << comment << "{ ";
    for (const auto& element : container)
        std::cout << element << (--size ? ", " : " ");
    std::cout << "}\n";
}
int main()
{
    std::unordered_set<int> x{1, 2, 3}, y, z;
    const auto w = {4, 5, 6, 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, 2, 1 }
y = { }
z = { }
Copy assignment copies data from x to y:
x = { 3, 2, 1 }
y = { 3, 2, 1 }
Move assignment moves data from x to z, modifying both x and z:
x = { }
z = { 3, 2, 1 }
Assignment of initializer_list w to z:
w = { 4, 5, 6, 7 }
z = { 7, 6, 5, 4 }

Смотрите также

конструирует unordered_set
(публичная функция-член)