Этот код создает упорядоченный список введенных слов. Инструкция
if (i==0 || vs[i]!=vs[i–1])
удаляет дубликаты. Если в программу ввести слова
There are only two kinds of languages: languages that people complain
about, and languages that people don’t use.
то результат ее работы будет выглядеть следующим образом:
about
and
are
complain
don’t
kind
languages
of
only
people
that
there
two
use
Почему мы получили на выходе don’t
, а не dont
? Потому что оставили апостроф за пределами списка разделителей whitespace()
.
Punct_stream
во многом похож на класс istream
, но на самом деле отличается от него. Например, мы не можем проверить его состояние с помощью функции rdstate()
, функция eof()
не определена, и нет оператора >>
, который вводит целые числа. Важно отметить, что мы не можем передать объект класса Punct_stream
в качестве аргумента функции, ожидающей поток istream
. Можно ли определить класс Punct_istream
, который в точности повторял бы поведение класса istream
? Можно, но у вас пока нет достаточного опыта программирования, вы еще не освоили основы проектирования и не знаете всех возможностей языка (если впоследствии вы вернетесь к этой задаче, то сможете реализовать буферы потоков на уровне профессионала).
Punct_stream
? Понятны ли вам объяснения? Могли бы вы самостоятельно написать такую программу? Еще несколько дней назад вы были новичком и честно закричали бы: “Нет, нет! Никогда!” или “Нет, нет! Вы что, с ума сошли? Очевидно, что ответ на поставленный вопрос отрицательный”. Цель нашего примера заключается в следующем:
• показать реальную задачу и способ ее решения;
• доказать, что это решение можно найти с помощью вполне доступных средств;
• описать простое решение простой задачи;
• продемонстрировать разницу между интерфейсом и реализацией.
Этот пример можно сравнить с уроком, на котором учитель английского языка для иностранцев произносит выражения на сленге, чтобы показать его колорит и живость.
11.8. И еще много чего
12.35
, в большинстве европейских языков означает 12,35
. Естественно, стандартная библиотека С++ предоставляет возможности для устранения этих и многих других проблем. А как записать китайские иероглифы? Как сравнивать строки, записанные символами малайского языка? Ответы на эти вопросы существуют, но они выходят далеко за рамки нашей книги. Если вам потребуется более детальная информация, можете обратиться к более специализированным книгам (например, Langer,
Другим источником сложностей является буферизация; стандартные библиотечные потоки iostream
основаны на концепции под названием streambuf
. Для сложных задач, связанных с потоками iostream
, при решении которых важна производительность или функциональность, без объектов класса streambuf
обойтись нельзя. Если хотите определить свой собственный класс iostream
или настроить объекты класса iostream
на новые источники данных, см. главу 21 книги
При программировании на языке С++ вы можете обнаружить семейство стандартных функций ввода-вывода printf()
/scanf()
, определенных в языке С. В этом случае прочитайте разделы 27.6, B.10.2, или прекрасный учебник Кернигана и Ритчи
Стандартная библиотека ввода-вывода описана в приложении Б, а связанные с ней графические пользовательские интерфейсы — в главах 12–16.
Задание