10. Присвоение элементов итератору потока вывода для вывода их на экран — один из корректных способов использования итератора, но его создавали не для этого. Идея заключается в том, чтобы применить их вместе с алгоритмами. Самым простым алгоритмом является std::copy
copy(begin(v), end(v), oit);
cout << '\n';
copy(begin(v), end(v), oit_comma);
cout << '\n';
11. Помните функцию word_num
1
с "one "
, 2
с "two"
и т.д.? Можно использовать для вывода данных и ее. Нужен только оператор вывода потока, имеющий шаблон, специализированный для типа string
, поскольку мы больше не выводим целые числа. Вместо алгоритма std::copy
станем использовать алгоритм std::transform
, поскольку он позволяет применять функцию преобразования для каждого элемента входного диапазона до того, как эти элементы будут скопированы в выходной диапазон. transform(begin(v), end(v),
ostream_iterator<string
word_num
cout << '\n';
12. В последней строке выходных данных наконец используем структуру bork
std::transform
функцию преобразования, но не стали. Вместо этого можно просто создать итератор потока вывода, который специализирован для типа bork
в вызове std::copy
. В результате экземпляры типа bork
будут copy(begin(v), end(v),
ostream_iterator
}
13. Компиляция и запуск программы дадут следующий результат. Первые две строки полностью идентичны следующим двум строкам, как мы и ожидали.
Далее мы получили «аккуратные» строки, содержащие текстовое написание чисел, разделенное пробелами, а после этого — множество строк bork!
"\n"
вместо пробелов.$ ./ostream_printing 12345
1, 2, 3, 4, 5,
12345
1, 2, 3, 4, 5,
one two three four five bork!
bork! bork!
bork! bork! bork!
bork! bork! bork! bork!
bork! bork! bork! bork! bork!
Как это работает
Мы увидели, что итератор std::ostream_iterator
Итераторы потока вывода, специализированные для типа T
ostream_ iterator
), работают для всех типов, для которых предоставлена реализация ostream& operator<<(ostream&, const T&)
.Итератор ostream_iterator
<<
того типа, для которого он был специализирован, с помощью своего параметра шаблона. Он попробует неявно преобразовать типы, если это разрешено. Когда мы итерируем по диапазону элементов типа A
, но копируем данные элементы в экземпляры типа output_iterator
, то код будет работать при условии, что тип A
можно неявно преобразовать к типу B
. Мы сделали именно это для структуры bork
: экземпляр типа bork
можно неявно получить из целочисленного значения. Как следствие, можно легко сгенерировать множество строк "bork! "
на консоли пользователя.Если неявное преобразование выполнить нельзя, можно провести его самостоятельно с помощью алгоритма std::transform
word_num
.
Перенаправляем выходные данные в файл для конкретных разделов кода