Тело серийного оператора for не должно изменять размер перебираемой последовательности.

Упражнения раздела 3.3.2

Упражнение 3.14. Напишите программу, читающую последовательность целых чисел из потока cin и сохраняющую их в векторе.

Упражнение 3.15. Повторите предыдущую программу, но на сей раз читайте строки.

<p><image l:href="#reader.png"/>3.3.3. Другие операции с векторами</p>

Кроме функции 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 v{1,2,3,4,5,6,7,8,9};

for (auto &i : v)  // для каждого элемента вектора v

                   // (обратите внимание: i - ссылка)

 i *= i;           // квадрат значения элемента

for (auto i : v)   // для каждого элемента вектора 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 всегда необходимо указывать тип хранимого элемента (раздел 3.3).

vector::size_type // ok

vector::size_type      // ошибка

Операторы равенства и сравнения вектора ведут себя как соответствующие операторы класса string (раздел 3.2.2). Два вектора равны, если у них одинаковое количество элементов и значения соответствующих элементов совпадают. Операторы сравнения полагаются на алфавитный порядок: если у векторов разные размеры, но соответствующие элементы равны, то вектор с меньшим количеством элементов меньше вектора с большим количеством элементов. Если у элементов векторов разные значения, то их отношения определяются по первым отличающимся элементам.

Сравнить два вектора можно только в том случае, если возможно сравнить элементы этих векторов. Некоторые классы, такие как string, определяют смысл операторов равенства и сравнения. Другие, такие как класс Sales_item, этого не делают. Операции, поддерживаемые классом Sales_item, перечислены в разделе 1.5.1. Они не включают ни операторов равенства, ни сравнения. В результате нельзя сравнить два вектора объектов класса Sales_item.

Вычисление индекса вектора
Перейти на страницу:

Похожие книги