std::unordered_set<Key,Hash,KeyEqual,Allocator>::operator=
unordered_set& operator=( const unordered_set& other ); | (1) | (начиная с C++11) |
unordered_set& operator=( unordered_set&& other ); | (2) |
(начиная с C++11) (до C++17) |
unordered_set& operator=( unordered_set&& other ) noexcept(/* see below */); | (начиная с C++17) | |
unordered_set& operator=( std::initializer_list<value_type> ilist ); | (3) | (начиная с C++11) |
Заменяет содержимое контейнера.
other.std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value равно true, аллокатор *this заменяется копией other. Если аллокатор *this после присваивания будет сравниваться неравно со своим прежним значением, старая память освобождается с помощью старого аллокатора, затем новый аллокатор используется для её выделения перед копированием элементов. В противном случае память, принадлежащая *this, может быть повторно использована, если это возможно. В любом случае элементы, изначально принадлежавшие *this, могут быть либо уничтожены, либо заменены поэлементным копирующим присваиванием.other, используя семантику перемещения (т. е. данные в other перемещаются из other в этот контейнер). После этого other находится в допустимом, но неуказанном состоянии.std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value равно true, аллокатор *this заменяется копией аллокатора other. Если оно равно false и аллокаторы *this и other сравниваются неравно, *this не может получить во владение память, принадлежащую other, и должен перемещать каждый элемент по отдельности, при необходимости выделяя дополнительную память с помощью собственного аллокатора. В любом случае все элементы, изначально принадлежавшие *this, уничтожаются либо заменяются поэлементным перемещающим присваиванием.ilist.Параметры
| other | - | другой контейнер, используемый в качестве источника данных |
| ilist | - | список инициализации, используемый в качестве источника данных |
Возвращаемое значение
*this
Сложность
*this и other.*this, если аллокаторы сравниваются неравно и не распространяются; в этом случае сложность линейная относительно размеров *this и other.*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_set другому:
#include <initializer_list>
#include <iostream>
#include <iterator>
#include <unordered_set>
void print(auto const comment, auto const& container)
{
auto size = std::size(container);
std::cout << comment << "{ ";
for (auto const& 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 (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/unordered_set/operator%3D