Упражнение 9.13. Как инициализировать контейнер vector из контейнера list и контейнера vector? Напишите код для проверки ответов.
9.2.5. Присвоение и функция swap()
Связанные с присвоением операторы, перечисленные в табл. 9.4, воздействуют на весь контейнер. Оператор присвоения заменяет весь диапазон элементов в левом контейнере копиями элементов из правого:
c1 = c2; //
//
c1 = {a,b,c}; //
После первого присвоения контейнеры слева и справа равны. Если контейнеры имели неравный размер, после присвоения у обоих будет размер контейнера из правого операнда. После второго присвоения размер контейнера c1 составит 3, что соответствует количеству значений, представленных в списке.
Таблица 9.4. Операторы присвоения контейнеров
c1 = c2 | Заменяет элементы контейнера c1 копиями элементов контейнера c2. Контейнеры c1 и c2 должны иметь тот же тип |
с = {a, b, с...} | Заменяет элементы контейнера c1 копиями элементов списка инициализации. (Недопустимо для массива.) |
swap(c1, c2) c1.swap(c2) | Обменивает элементы контейнеров c1 и c2. Контейнеры c1 и c2 должны иметь тот же тип. Обычно функция swap() выполняется намного быстрее, чем процесс копирования элементов из контейнера c2 в c1 |
| Операторы присвоения недопустимы для ассоциативных контейнеров и массива | |
|---|---|
seq.assign(b,е) | Заменяет элементы в контейнере seq таковыми из диапазона, обозначенного итераторами b и е. Итераторы b и е не должны ссылаться на элементы в контейнере seq |
seq.assign(il) | Заменяет элементы в контейнере seq таковыми из списка инициализации il |
seq.assign(n,t) | Заменяет элементы в контейнере seq набором из n элементов со значением t |
В отличие от встроенных массивов, библиотечный тип array поддерживает присвоение. У левых и правых операндов должен быть одинаковый тип:
array
array
a1 = а2; //
а2 = {0}; //
Поскольку размер правого операнда может отличаться от размера левого операнда, тип array не поддерживает функцию assign() и это не позволяет присваивать значения из списка.
assign() (только последовательные контейнеры)Оператор присвоения требует совпадения типов левых и правых операндов. Он копирует все элементы правого операнда в левый. Последовательные контейнеры (кроме array) определяют также функцию-член assign(), обеспечивающую присвоение разных, но совместимых типов, или присвоение контейнерам последовательностей. Функция assign() заменяет все элементы в левом контейнере копиями элементов, указанных в ее аргументе. Например, функцию assign() можно использовать для присвоения диапазона значений char* из вектора в список строк:
list
vector
names = oldstyle; //
//
names.assign(oldstyle.cbegin(), oldstyle.cend());
Вызов функции assign() заменяет элементы в контейнере names копиями элементов из диапазона, обозначенного итераторами. Аргументы функции assign() определяют количество элементов контейнера и их значения.
assign(), не должны относиться к контейнеру, для которого вызвана функция assign().