Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

  fill_n(back_inserter(vi),200,7); // добавляет 200 семерок

                                   // в конец vi

}

<p id="AutBody_Root668"><strong>Б.6.2. Объекты-функции</strong></p>

Многие стандартные алгоритмы принимают в качестве аргументов объекты-функции (или функции), чтобы уточнить способ решения задачи. Обычно эти функции используются в качестве критериев сравнения, предикатов (функций, возвращающих значения типа bool) и арифметических операций. Несколько самых общих объектов-функций описано в заголовке стандартной библиотеки.

Рассмотрим следующий пример:

vector v;

// ...

sort(v.begin,v.end,greater); // сортировка v в убывающем

                                        // порядке

Обратите внимание на то, что предикаты logical_and и logical_or всегда вычисляют оба свои аргумента (в то время как операторы && и || — нет).

<p id="AutBody_Root669"><strong>Б.6.3. Класс pair</strong></p>

В заголовке стандартная библиотека содержит несколько вспомогательных компонентов, включая класс pair.

template

  struct pair {

    typedef T1 first_type;

    typedef T2 second_type;

    T1 first;

    T2 second;

    pair;      // конструктор по умолчанию

    pair(const T1& x,const T2& y);

                 // копирующие операции:

    template pair(const pair& p);

};

template

  pair make_pair(T1 x, T2 y) { return pair(x,y); }

Функция make_pair упрощает использование пар. Например, рассмотрим схему функции, возвращающей значение и индикатор ошибки.

pair my_fct(double d)

{

  errno = 0; // очищаем индикатор ошибок в стиле языка C

             // выполняем много вычислений, связанных с переменной d,

             // и вычисляем x

  error_indicator ee = errno;

  errno = 0; // очищаем индикатор ошибок в стиле языка C

  return make_pair(x,ee);

}

Этот пример является полезной идиомой. Его можно использовать следующим образом:

pair res = my_fct(123.456);

if (res.second==0) {

  // используем res.first

}

else {

  // Ой: ошибка

}

<p id="AutBody_Root670"><strong>Б.7. Потоки ввода-вывода</strong></p>

Библиотека потоков ввода-вывода содержит средства форматированного и неформатированного буферизованного ввода-вывода текста и числовых значений.

Определения потоков ввода-вывода находятся в заголовках , и т.п. (см. раздел Б.1.1).

Объект класса ostream преобразовывает объекты, имеющие тип, в поток символов (байтов).

Объект класса istream преобразовывает поток символов (байтов) в объекты, имеющие тип.

Объект класса iostream — это поток, который может действовать и как объект класса istream, и как объект класса ostream. Буфера, изображенные на диаграмме, являются потоковыми буферами (streambuf). Если читателям потребуется перейти от потоков класса iostream к новым видам устройств, файлов или памяти, они смогут найти их описание в профессиональных учебниках.

Существуют три стандартных потока.

<p id="AutBody_Root671"><strong>Б.7.1. Иерархия потоков ввода-вывода</strong></p>

Поток istream можно связать с устройством ввода (например, клавиатурой), файлом или объектом класса string. Аналогично поток ostream можно связать с устройством вывода (например, текстовым окном), файлом или объектом класса string. Потоки ввода-вывода образуют иерархию классов.

Поток можно открыть либо с помощью конструктора, либо вызова функции open.

Для файловых потоков имя файлов представляет собой строку в стиле языка С.

Открыть файл можно в одном из режимов, приведенных ниже.

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

void my_code(ostream& os); // функция my_code может использовать

                           // любой поток вывода

ostringstream os;          // буква "o" означает "для вывода"

ofstream of("my_file");

if (!of) error("невозможно открыть 'my_file' для записи");

my_code(os); // используется объект класса string

my_code(of); // используется файл

См. раздел 11.3.

<p id="AutBody_Root672"><strong>Б.7.2. Обработка ошибок</strong></p>

Поток iostream может пребывать в одном из четырех состояний.

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT