Тело серийного оператора
for
не должно изменять размер перебираемой последовательности.
Упражнение 3.14. Напишите программу, читающую последовательность целых чисел из потока cin
и сохраняющую их в векторе.
Упражнение 3.15. Повторите предыдущую программу, но на сей раз читайте строки.
Кроме функции push_back()
, шаблон vector
предоставляет еще несколько операций, большинство из которых подобно соответствующим операциям класса string
. Наиболее важные из них приведены в табл. 3.5.
Таблица 3.5. Операции с векторами
v.empty() | Возвращает значение true , если вектор v пуст. В противном случае возвращает значение false |
v.size() | Возвращает количество элементов вектора v |
v.push_back(t) | Добавляет элемент со значением t в конец вектора v |
v[n] | Возвращает ссылку на элемент в позиции n вектора v |
v1 = v2 | Заменяет элементы вектора v1 копией элементов вектора v2 |
v1 = {a,b,с ... } | Заменяет элементы вектора v1 копией элементов из разделяемого запятыми списка |
v1 == v2 v1 != v2 | Векторы v1 и v2 равны, если они содержат одинаковые элементы в тех же позициях |
< , <= , > , >= | Имеют обычное значение и полагаются на алфавитный порядок |
Доступ к элементам вектора осуществляется таким же способом, как и к символам строки: по их позиции в векторе. Например, для обработки все элементов вектора можно использовать серийный оператор for
(раздел 3.2.3).
vector
for (auto &i : v) //
//
i *= i; //
for (auto i : v) //
cout << i << " "; //
cout << endl;
В первом цикле управляющая переменная i
определяется как ссылка, чтобы использовать ее для присвоения новых значений элементам вектора v
. Используя спецификатор auto
, позволим вывести ее тип автоматически. Этот цикл использует новую форму составного оператора присвоения (раздел 1.4.1). Как известно, оператор +=
добавляет правый операнд к левому и сохраняет результат в левом операнде. Оператор *=
ведет себя точно так же, но перемножает левый и правый операнды, сохраняя результат в левом операнде. Второй серийный оператор for
отображает каждый элемент.
Функции-члены empty()
и size()
вектора ведут себя так же, как и соответствующие функции класса string
(раздел 3.2.2): функция empty()
возвращает логическое значение, указывающее, содержит ли вектор какие-нибудь элементы, а функция size()
возвращает их количество. Функция-член size()
возвращает значение типа size_type
, определенное соответствующим типом шаблона vector
.
Чтобы использовать тип
size_type
, необходимо указать тип, для которого он определен. Для типа vector
vector
vector::size_type //
Операторы равенства и сравнения вектора ведут себя как соответствующие операторы класса string
(раздел 3.2.2). Два вектора равны, если у них одинаковое количество элементов и значения соответствующих элементов совпадают. Операторы сравнения полагаются на алфавитный порядок: если у векторов разные размеры, но соответствующие элементы равны, то вектор с меньшим количеством элементов меньше вектора с большим количеством элементов. Если у элементов векторов разные значения, то их отношения определяются по первым отличающимся элементам.
Сравнить два вектора можно только в том случае, если возможно сравнить элементы этих векторов. Некоторые классы, такие как string
, определяют смысл операторов равенства и сравнения. Другие, такие как класс Sales_item
, этого не делают. Операции, поддерживаемые классом Sales_item
, перечислены в разделе 1.5.1. Они не включают ни операторов равенства, ни сравнения. В результате нельзя сравнить два вектора объектов класса Sales_item
.