1.2. Знакомство с STL

Установив современный компилятор C++, мы можем сразу начать исполь­зовать STL, например откомпилировать и запустить следующую програм­му. Эта программа читает с клавиатуры переменное количество ненулевых целых чисел и печатает их в том же порядке после того, как введен 0. Дан­ная задача может показаться слишком простой, но на самом деле это не так, потому что нет ограничения на количество вводимых чисел:

// readwr.cpp: Чтение и вывод переменного количества

//                        ненулевых целых   (ввод завершается нулем).

#include <iostream>

#include <vector>

using namespace  std;

int main()

{    vector<int> v;

int x;

cout << "Enter positive integers, followed by 0:\n";

while (cin >> x, x != 0) v.push_back(x);

vector<int>::iterator  i;

for   (i=v.begin();   i   != v.end();   ++i) cout <<  *i <<  "   ";

cout  <<  endl;

return  0; }

Мы можем использовать шаблон vector как массив переменной длины. Сначала эта длина равна нулю. Поскольку мы хотим, чтобы элементы век­тора были целого типа, то всегда пишем vector<int>, чтобы обозначить класс, с которым работаем. Выражение

v.push_back(x);

добавляет значение х типа int в конец вектора v.

Оператор for в этой программе используется аналогично тому, как это сделано в следующем фрагменте кода, который выводит массив а вместо вектора v.

int  a[N],   *р;

for   (p=a;   p   !=  a+N;   p++) cout  <<  *p <<   "   ";

Напомним, что выражения &<з[0] и а эквивалентны, равно как и выраже­ния &a[N] и а + N. Начав с первого элемента, мы проходим массив, пока

не оказываемся за его концом: хотя указываем на адрес a[N], последний элемент массива - a[N-l]. Это может выглядеть опасным, но поскольку мы не используем значение a[N], а только его адрес, такой стиль абсолют­но безопасен. Переменная i, определенная как

vector<int>::iterator  i;

называется итератором. Она используется таким же образом, как указа­тель в вышеприведенном фрагменте. Значение итератора для первого эле­мента вектора v обозначается выражением v.beginQ, а значение итератора для элемента, следующего за конечным, обозначается как v.endQ. Значение элемента вектора, на который ссылается допустимый итератор г, обознача­ется выражением * г, как если бы i был указателем


<< назад вперед >>