Большее из 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: