std::multiset::operator=
Материал из cppreference.com
multiset& operator=( const multiset& other ); |
(1) | |
(2) | ||
multiset& operator=( multiset&& other ); |
(начиная с C++11) (до C++17) |
|
multiset& operator=( multiset&& other ) noexcept(/* смотрите ниже */); |
(начиная с C++17) | |
multiset& 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
используется для выделения памяти перед копированием элементов. (начиная с C++11).2) Оператор присваивания перемещением. Заменяет текущее содержимое содержимым
other
, используя семантику переноса (т.е. данные перемещаются из other
в этот контейнер). После данной операции other
находится в корректном, но неопределенном состоянии. Если std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value равно true, то аллокатор текущего контейнера заменяется копией аллокатора присваиваемого. Если же это значение false и аллокаторы текущего и присваиваемого контейнера не равны, то, поскольку текущий контейнер не может завладеть памятью присваиваемого, он вынужден присвоить перемещением каждый элемент по отдельности, выделяя дополнительную память с помощью своего аллокатора если потребуется. В любом случае все элементы изначально находящиеся в *this либо уничтожаются либо заменяются путём поэлементного присваивания.3) Заменяет текущее содержимое содержимым
ilist
.Содержание |
[править] Параметры
other | — | другой контейнер, используемый как источник данных |
ilist | — | список инициализаторов, используемый как источник данных |
[править] Возвращаемое значение
*this
[править] Сложность
1) Линейная от размера
*this
и other
.2) Линейная от размера
*this
, помимо случая, когда аллокаторы не равны и не распространяются при присваивании, в котором линейная от размера *this
и other
.3) O(NlogN) в обычном случае, где N равняется size() + ilist.size(). Линейная если ilist - отсортирован согласно value_comp().
Исключения2)
спецификация noexcept:
noexcept(std::allocator_traits<Allocator>::is_always_equal::value && std::is_nothrow_move_assignable<Compare>::value) |
(начиная с C++17) |
[править] Примечания
После присвоения перемещением (перегрузка (2)), помимо случая, когда поэлементное присвоение произошло по причине несовместимых аллокаторов, ссылки, указатели и итераторы (кроме end итератора) из other
остаются корректными, но ссылаются на элементы, которые теперь находятся в *this. Текущий стандарт даёт такую гарантию согласно общему утверждению из [container.requirements.general]/12, более прямая гарантия рассматривается в [lwg-2321].
[править] Пример
Код ниже использует operator=
для того, чтобы присвоить один std::multiset другому:
Запустить этот код
#include <set> #include <iostream> void display_sizes(char const* comment, const std::multiset<int>& nums1, const std::multiset<int>& nums2, const std::multiset<int>& nums3) { std::cout << comment << " nums1: " << nums1.size() << ',' << " nums2: " << nums2.size() << ',' << " nums3: " << nums3.size() << '\n'; } void display(char const* comment, const std::multiset<int>& v) { std::cout << comment << "{ "; for (int e : v) { std::cout << e << ' '; } std::cout << "}\n"; } int main() { std::multiset<int> nums1 {3, 1, 4, 6, 5, 9}; std::multiset<int> nums2; std::multiset<int> nums3; display_sizes("Сначала:\n", nums1, nums2, nums3); // присвоение копированием копирует данные nums1 в nums2 nums2 = nums1; display_sizes("После присвоения:\n", nums1, nums2, nums3); // присвоение перемещением перемещает данные из nums1 в nums3, // изменяя, как nums1, так и nums3 nums3 = std::move(nums1); display_sizes("После присвоения перемещением:\n", nums1, nums2, nums3); display("Теперь nums3 = ", nums3); // Присвоение копированием списка инициализаторов копирует данные в nums3 nums3 = {1, 2, 3}; display("После присвоения initializer_list \n nums3 = ", nums3); }
Вывод:
Сначала: nums1: 6, nums2: 0, nums3: 0 После присвоения: nums1: 6, nums2: 6, nums3: 0 После присвоения перемещением: nums1: 0, nums2: 6, nums3: 6 Now nums3 = { 1 3 4 5 6 9 } После присвоения initializer_list nums3 = { 1 2 3 }
[править] См. также
создаёт multiset (public функция-элемент) |