Итераторные адаптеры. Потоковые итераторы вывода

   
На этом шаге мы рассмотрим потоковые итераторы вывода.

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

Таблица 1. Операции потоковых итераторов вывода

ВыражениеОписание
ostream_iterator<T>(ostream)Создание потокового итератора вывода для потока данных ostream
ostream_iterator<T>(ostream,delim)Создание потокового итератора вывода для потока данных ostream с разделением выводимых значений
строкой delim (параметр dellm относится к типу const char*)
*iterФиктивная операция (возвращает iter)
iter1 = valueЗаписывает value в поток данных ostream: ostream<<value (после чего выводится разделитель delim, если он задан)
++iterФиктивная операция (возвращает iter)
iter++Фиктивная операция (возвращает iter)

   
При создании потокового итератора вывода необходимо указать выходной поток данных, в который должны
записываться данные. В необязательном аргументе можно передать строку, которая должна выводиться между
отдельными значениями. Без разделителя элементы будут выводиться непосредственно друг за другом.

   
Потоковые итераторы вывода определяются для типа элемента Т:

namespace std {
  template <class T,
                  class charT = char, 
                  class traits = char_traits<char_T> > 
  class ostream_iterator; 
}

   
Необязательные второй и третий аргументы шаблона определяют тип используемого потока данных.

   
Следующий пример демонстрирует использование потоковых итераторов вывода.

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;


std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

int main(int argc, char* argv[])
{
  // Создание потокового итератора вывода для потока cout 
  // - выводимые значения разделяются символом новой строки 
  ostream_iterator<int> intWriter(cout,"\n");

  // Запись элементов через обычный интерфейс итераторов
  *intWriter = 42;
  intWriter++;
  *intWriter = 77;
  intWriter++;
  *intWriter = -5;

  // Создание коллекции с элементами от 1 до 9 
  vector<int> coll; 
  for (int i=1; i<=9; ++i) { 
    coll.push_back(i);
  }

  // Запись всех элементов без разделителей 
  cout << ToRus("Элементы без разделителей:\n");
  copy (coll.begin(), coll.end(),
        ostream_iterator<int>(cout)); 
  cout << endl;

  // Запись всех элементов с разделителем " <" 
  cout << ToRus("Элементы c разделителеm \"<\":\n");
  copy (coll.begin(), coll.end(),
        ostream_iterator<int>(cout," < ")); 
  cout << endl;

  getch();
  return 0;
}

//---------------------------------------------------------------------------

Текст этого примера можно взять здесь.

   
Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

   
Разделитель относится к тину const char*, поэтому при передаче объекта типа string необходимо
преобразовать его к правильному типу вызовом функции c_str(). Пример:

  string delim; 
  .   .   .   .  
  ostream_iterator<int>(cout,delim.c_str());

   
На следующем шаге мы рассмотрим потоковые итераторы ввода.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий