typedef                                      istream_iterator<int, ptrdiff_t> istream_iter; #else     // Для VC5.0:

typedef     istream_iterator<int> istream_iter; #endif

int main()

{ vector<int> a;

ifstream file("example.txt");

if (file.failO)

{ cout « "Cannot open file example.txt.\n";

return 1; } copy(istream_iter(file), istream_iter(),

inserter(a, a.beginf))); copy(a.begin(), a.end(),

#if defined(_ BORLANDC_ ) && _ BORLANDC_ == 0x530

ostream_iterator<int, char,

char_traits<char> >(cout, " ")); #else

ostream_iterator<int>(cout, " ")); #endif

cout « endl; return 0; }

Поскольку эта программа не принимает во внимание структуру входного файла, вывод состоит только из одной строчки:

10  20  30  40   50

Мы вернемся к потоковым итераторам в разделе 6.6.

Операции с итераторами

Вспомним, что мы можем применять арифметические операции к итера­торам произвольного доступа, подобно тому, как оперируем с указателя­ми, написав, например:

int n, dist;

...       // i и i0 являются итераторами произвольного доступа

i0 = i;

i += n;

dist = i - iO;   // dist == n

Вместо этого мы можем использовать функции advance и distance:

int n,  dist;

...            //   i и iO  являются итераторами,   но

//  необязательно произвольного доступа iO  =  i;

advance(i,   n); dist  =  0; distance(iO,   i,   dist);   //  dist  == n

Приведенный фрагмент1 работает для всех итераторов, если п имеет ра­зумное значение, так что модифицированное значение i ссылается либо на существующий, либо на следующий за последним элемент рассматривае­мого контейнера. Если i является прямым итератором, п должно быть

В стандарте C++ принята функция distance с двумя аргументами вместо трех. По­этому для компилятора, отвечающего стандарту, следует писать: dist = distance(i0, i) вместо dist = 0; distance(i0, i, dist). - Прим. переводчика.

положительным. Тогда приведенный выше вызов функции advance имеет то же действие, что и применение оператора ++ к i n раз. Операции advance и distance будут выполняться гораздо быстрее для итераторов произволь­ного доступа, чем для итераторов других типов.


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