Выбрать главу

Большее из 10, 20 равно false

и все стало бы ясно. По умолчанию литерал false печатается как 0, а true – как 1. Это можно изменить, воспользовавшись манипулятором boolalpha(), что и сделано в следующей программе:

int main()

{

cout "печать значений типа bool по умолчанию: "

true " " false

"\nи в виде строк: "

boolalpha()

true " " false

endl;

}

Вот результат:

печать значений типа bool по умолчанию: 1 0

и в виде строк: true false

Для вывода массива, а также вектора или отображения, необходимо обойти все элементы и напечатать каждый из них:

#include iostream

#include vector

#include string

string pooh_pals[] = {

"Тигра", "Пятачок", "Иа-Иа", "Кролик"

};

int main()

{

vectorstring ppals( pooh_pals, pooh_pals+4 );

vectorstringt::iterator iter = ppals.begin();

vectorstring::iterator iter_end = ppals.end();

cout "Это друзья Пуха: ";

for ( ; iter != iter_end; iter++ )

cout *iter " ";

cout endl;

}

Вместо того чтобы явно обходить все элементы контейнера, выводя каждый по очереди, можно воспользоваться потоковым итератором ostream_iterator. Так выглядит эквивалентная программа, где используется эта техника (подробное обсуждение итератора ostream_iterator см. в разделе 12.4):

#include iostream

#include algorithm

#include vector

#include string

string pooh_pals[] = {

"Тигра", "Пятачок", "Иа-Иа", "Кролик"

};

int main()

{

vectorstring ppals( pooh_pals, pooh_pals+4 );

vectorstring::iterator iter = ppals.begin();

vectorstring::iterator iter_end = ppals.end();

cout "Это друзья Пуха: ";

// копируем каждый элемент в cout ...

ostream_iteratorstring output( cout, " " );

copy( iter, iter_end, output );

cout endl;

}

Программа печатает такую строку:

Это друзья Пуха: Тигра Пятачок Иа-Иа Кролик

Упражнение 20.1

Даны следующие определения объектов:

string sa[4] = { "пух", "тигра", "пятачок", "иа-иа" };

vectorstring svec( sa, sa+4 );

string robin( "кристофер робин" );

const char *pc = robin.c_str();

int ival = 1024;

char blank = ' ';

double dval = 3.14159;

complex purei( 0, 7 );

(a)Направьте значение каждого объекта в стандартный вывод.

(b)Напечатайте значение адреса pc.

(c)Напечатайте наименьшее из двух значений ival и dval, пользуясь оператором условного выражения:

ival dval ? ival : dval

20.2. Ввод

Основное средство реализации ввода – это оператор сдвига вправо (). Например, в следующей программе из стандартного ввода читается последовательность значений типа int и помещается в вектор:

#include iostream

#include vector

int main()

{

vectorint ivec;

int ival;

while ( cin ival )

ivec.push_back( ival );

// ...

}

Подвыражение

cin ival;

читает целое число из стандартного ввода и копирует его в переменную ival. Результатом является левый операнд – объект класса istream, в данном случае cin. (Как мы увидим, это позволяет сцеплять операторы ввода.)

Выражение

while ( cin ival )

читает последовательность значений, пока cin не станет равно false. Значение istream может быть равно false в двух случаях: достигнут конец файла (т.е. все значения из файла прочитаны успешно) или встретилось неверное значение, скажем 3.14159 (десятичная точка недопустима в целом числе), 1e-1 (буква e недопустима) или любой строковый литерал. Если вводится неверное значение, объект istream переводится в состояние ошибки и чтение прекращается. (В разделе 20.7 мы подробнее расскажем о таких состояниях.)

Есть набор предопределенных операторов ввода, принимающих аргументы любого встроенного типа, включая C-строки, а также стандартных библиотечных типов string и complex:

#include iostream

#include string

int main()

{

int item_number;

string item_name;

double item_price;

cout "Пожалуйста, введите item_number, item_name и price: "

endl;

cin item_number;

cin item_name;

cin item_price;

cout "Введены значения: item# "

item_number " "

item_name " @$"

item_price endl;

}

Вот пример выполнения этой программы:

Пожалуйста, введите item_number, item_name и price: