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 будут выполняться гораздо быстрее для итераторов произвольного доступа, чем для итераторов других типов.
<< назад вперед >>