По существу, мы постоянно работаем с текстом. Наши книги заполнены текстом, большая часть того, что мы видим на экране компьютера, — это текст, и исходный код наших программ является текстом. Наши каналы связи (всех видов) переполнены словами. Всю информацию, которой обмениваются два человека, можно было бы представить в виде текста, но не будем заходить так далеко. Изображения и звуки обычно лучше всего представлять в виде изображений и звуков (т.е. в виде совокупности битов), но все остальное можно обрабатывать с помощью программ анализа и преобразования текста.
Начиная с главы 3 мы использовали классы iostreams
и string
, поэтому здесь кратко опишем библиотеки, которым они принадлежат. Особенно полезны для обработки текстов ассоциативные массивы (раздел 23.4), поэтому мы приводим пример их использования для анализа электронной почты. Кроме этого обзора, в главе рассматриваются вопросы поиска шаблонных фрагментов в тексте с помощью регулярных выражений (разделы 23.5–23.10).
23.2. Строки
Класс string содержит последовательность символов и несколько полезных операций, таких как добавление символа к строке, определение длины строки и конкатенация двух строк. На самом деле стандартный класс string содержит довольно мало операций, но большинство из них оказываются полезными только при низкоуровневой обработке действительно сложных текстов. Здесь мы лишь упомянем о нескольких наиболее полезных операциях. При необходимости их полное описание (и исчерпывающий список операций из класса string
) можно найти в справочнике или учебнике повышенной сложности. Эти операции определены в заголовке
(но не
).
Операции ввода-вывода описаны в главах 10-11, а также в разделе 23.3. Обратите внимание на то, что операции ввода в объект класса string при необходимости увеличивают его размер, поэтому переполнение никогда не происходит.
Операции insert()
и append()
перемещают символы, чтобы освободить место для новых. Операция erase()
сдвигает символы влево, чтобы заполнить пробел, оставшийся после удаления символа.
basic_string
, поддерживающим множество наборов символов, например, Unicode, в котором предусмотрены тысячи символов (таких как £, Ω, ∞, δ, ζ, и ♫, кроме обычных символов). Скажем, если у вас есть шрифт, содержащий символ из набора Unicode, например Unicode, можете написать следующий фрагмент кода:
basic_string
Стандартный класс string
, который мы используем, является просто классом basic_string
, конкретизированным обычным типом char
.
typedef basic_string
string
, потоки класса iostream
и регулярные выражения). Если вам нужны символы кода Unicode, то лучше всего попросить совета у опытных пользователей; для того чтобы ваша программа стала полезной, вы должны не только выполнять правила языка, но и некоторые системные соглашения.
В контексте обработки текста важно помнить, что практически все можно представить в виде строки символов. Например, на этой странице число 12.333
представлено в виде строки, состоящей из шести символов и окруженной пробелами.
string
и объектов класса string
в числа. В разделе 11.4 мы видели, как превратить целое число в объект класса string
, используя класс ostringstream. Этот прием можно обобщить для любого типа, имеющего оператор <<
.
template
{
ostringstream os;
os << t;
return os.str();
}
Рассмотрим пример.
string s1 = to_string(12.333);
string s2 = to_string(1+5*6–99/7);
Значение строки s1
равно "12.333
", а значение строки s2
— "17
". Фактически функцию to_string()
можно применять не только к числовым значениям, но и к любому классу T
с оператором <<
.
Обратное преобразование, из класса string
в число, так же просто, как и полезно.
struct bad_from_string:std::bad_cast
// класс для сообщений об ошибках при преобразовании строк
{
const char* what() const // override bad_cast’s what()
{
return "bad cast from string";
}
};
template
{