std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::operator=
unordered_map& operator=( const unordered_map& other ); |
(1) | (с C++11) |
| (2) | ||
unordered_map& operator=( unordered_map&& other ); |
(с C++11) (до C++17) |
|
unordered_map& operator=( unordered_map&& other ) noexcept(/* see below */); |
(с C++17) | |
unordered_map& 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. Исключения
| Может выбросить исключение, определённое реализацией. |
(до C++17) |
1,3) Может выбросить исключение, определённое реализацией. 2) noexcept спецификация: noexcept(std::allocator_traits<Allocator>::is_always_equal::value |
(с C++17) |
Примечания
После присваивания с перемещением контейнера (перегрузка (2)), если присваивание по элементам не принудительно заставляется несовместимыми аллокаторами, ссылки, указатели и итераторы (кроме итератора конца) на other остаются валидными, но ссылаются на элементы, которые теперь находятся в *this. Текущий стандарт даёт это гарантию через общее утверждение в [container.reqmts]/67, и более прямая гарантия рассматривается в LWG issue 2321.
Пример
Следующий код использует operator= для присваивания одного std::unordered_map другому:
#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_map<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_map (публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/unordered_map/operator%3D