А теперь пересмотрим предыдущую программу так, чтобы она выводила только непустые строки:
>// читать ввод построчно и отбрасывать пустые строки
>while (getline(cin, line))
> if (!line.empty())
> cout << line << endl;
Условие использует оператор логического NOT (оператор>!
). Он возвращает инверсное значение своего операнда типа >bool
. В данном случае условие истинно, если строка >line
не пуста.
Функция >size()
возвращает длину строки (т.е. количество символов в ней). Давайте используем ее для вывода строк длиной только больше 80 символов.
>string line;
>// читать ввод построчно и отображать строки длиной более 80 символов
>while (getline(cin, line))
> if (line.size() > 80)
> cout << line << endl;
>string::size_type
Вполне логично ожидать, что функция >size()
возвращает значение типа >int
, а учитывая сказанное в разделе 2.1.1, вероятней всего, типа >unsigned
. Но вместо этого функция >size()
возвращает значение типа >string::size_type
. Этот тип требует более подробных объяснений.
В классе >string
(и нескольких других библиотечных типах) определены вспомогательные типы данных. Эти вспомогательные типы позволяют использовать библиотечные типы машинно-независимым способом. Тип >size_type
— это один из таких вспомогательных типов. Чтобы воспользоваться типом >size_type
, определенным в классе >string
, применяется оператор области видимости (оператор >::
), указывающий на то, что имя >size_type
определено в классе >string
.
Хотя точный размер типа >string::size_type
неизвестен, можно с уверенностью сказать, что этот беззнаковый тип (см. раздел 2.1.1) достаточно большой, чтобы содержать размер любой строки. Любая переменная, используемая для хранения результата операции >size()
класса >string
, должна иметь тип >string::size_type
.
>string::size_type
. По новому стандарту можно попросить компилятор самостоятельно применить соответствующий тип при помощи спецификаторов >auto
или >decltype
(см. раздел 2.5.2):
>auto len = line.size(); // len имеет тип string::size_type
Поскольку функция >size()
возвращает беззнаковый тип, следует напомнить, что выражения, в которых смешаны знаковые и беззнаковые данные, могут дать непредвиденные результаты (см. раздел 2.1.2). Например, если переменная >n
типа >int
содержит отрицательное значение, то выражение s>.size() < n
почти наверняка истинно. Оно возвращает значение >true
потому, что отрицательное значение переменной >n
преобразуется в большое беззнаковое значение.
>int
в выражениях, где используется функция >size()
.Класс >string
определяет несколько операторов для сравнения строк. Эти операторы сравнивают строки посимвольно. Результат сравнения зависит от регистра символов, символы в верхнем и нижнем регистре отличаются.
Операторы равенства (>==
и >!=
) проверяют, равны или не равны две строки соответственно. Две строки равны, если у них одинаковая длина и одинаковые символы. Операторы сравнения (