Строки Класс string в программах на C++ • Класс string предназначен для работы со строками типа char*, которые представляют собой строку с завершающим нулем. Класс string был введенн как альтернативный вариант для работы со строками типа char*. Строки, которые завершаются символом ‘\0’ еще называются C-строками. Поскольку, string есть классом, то можно объявлять объекты этого класса. • Чтобы использовать возможности класса string в MS Visual Studio (C++), нужно подключить библиотеку <string> и пространство имен std. #include <string> using namespace std; Пример // тип string string s1; // переменная с именем s1 типа string string s2 = "This is a string variable"; /* объявление с инициализацией использование переменной типа string с оператором присваивания */ s1 = s2; // s1 = "This is a string variable" s2 = "New text"; Какие преимущества и недостатки дает использование класса string в сравнении с типом char*? Создание нового типа string было обусловлено недостатками работы с строками символов, который демонстрировал тип char*. В сравнении с типом char* тип string имеет следующие основные преимущества: • возможность обработки строк стандартными операторами C++ (=, +, = =, <> и т.п.). Как известно, при использовании типа char* даже наиболее простые операции со строками выглядели сложно и требовали написания чрезмерного программного кода; • обеспечение лучшей надежности (безопасности) программного кода. Например, при копировании строк, тип string обеспечивает соответствующие действия, которые могут возникнуть в случае, если строка-источник имеет больший размер чем строка-приемник; • обеспечение строки, как самостоятельного типа данных. Объявление типа string как строки есть единым для всех переменных в программе, которая обеспечивает непротиворечивость данных. • Основным недостатком типа string в сравнении с типом char*, есть замедленная скорость обработки данных. Это связано с тем, что тип string – это, фактически, контейнерный класс. А работа с классом требует дополнительной реализации программного кода, который, в свою очередь занимает лишнее время. Какие операторы можно использовать с объектами класса string? • • • • • • • • • • = – присваивание + – конкатенация (объединение строк) += – присваивание с конкатенацией == – равенство != – неравенство < – меньше <= – меньше или равно > – больше >= – больше или равно [ ] – индексация // тип string, операции над строками string s1 = "s-1"; string s2 = "s-2"; string s3; bool b; // операция '=' (присваивание строк) s3 = s1; // s3 = "s-1" // операция '+' - конкатенация строк s3 = s3 + s2; // s3 = "s-1s-2" // операция '+=' - присваивание с конкатенацией s3 = "s-3"; s3 += "abc"; // s3 = "s-3abc" // операция '==' - сравнение строк b = s2==s1; // b = false b = s2=="s-2"; // b = true // операция '!=' - сравнение строк (не равно) s1 = "s1"; s2 = "s2"; b = s1 != s2; // b = true // операции '<' и '>' - сравнение строк s1 = "abcd"; s2 = "de"; b = s1 > s2; // b = false b = s1 < s2; // b = true // операции '<=' и '>=' - сравнение строк (меньше или равно, больше или равно) s1 = "abcd"; s2 = "ab"; b = s1 >= s2; // b = true b = s1 <= s2; // b = false b = s2 >= "ab"; // b = true // операция [] - индексация char c; s1 = "abcd"; c = s1[2]; // c = 'c' c = s1[0]; // c = 'a' Пример Ввод-вывод строк • Строка выводится точно так же, как и числовые значения: cout << S; • Для считывания строки можно использовать операцию ">>" для объекта cin: cin >> S; • В этом случае считывается строка из непробельных символов, пропуская пробелы и концы строк. Это удобно для того, чтобы разбивать текст на слова, или чтобы читать данные до конца файла при помощи while (cin >> S). • Можно считывать строки до появления символа конца строки при помощи функции getline. Сам символ конца строки считывается из входного потока, но к строке не добавляется: getline(cin S); Методы строк. Resize • S.resize(n) - Изменяет длину строки, новая длина строки становится равна n. При этом строка может как уменьшится, так и увеличиться. Если вызвать в виде S.resize(n, c), где c - символ, то при увеличении длины строки добавляемые символы будут равны c. Методы строк. Clear. Empty • S.clear() - очищает строчку, строка становится пустой. • S.empty() - возвращает true, если строка пуста, false - если непуста. Методы строк. Push_back. Erase • S.push_back(c) - добавляет в конец строки символ c, вызывается с одним параметром типа char. • S.erase(pos) - удаляет из строки S с символа с индексом pos и до конца строки. • S.erase(pos, count) - удаляет из строки S с символа с индексом pos количеством count или до конца строки, если pos + count > S.size(). Методы строк. Append • Добавляет в конец строки несколько символов, другую строку или фрагмент другой строки. Имеет много способов вызова. • S.append(n, c) - добавляет в конец строки n одинаковых символов, равных с. n имеет целочисленный тип, c - char. • S.append(T) - добавляет в конец строки S содержимое строки T. T может быть объектом класса string или C-строкой. • S.append(T, pos, count) - добавляет в конец строки S символы строки T начиная с символа с индексом pos количеством count. Методы строк. Insert • Вставляет в середину строки несколько символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первым параметром является значение i - позиция, в которую вставляются символы. Первый вставленный символ будет иметь индекс i, а все символы, которые ранее имели индекс i и более сдвигаются вправо. • S.insert(i, n, c) - вставить n одинаковых символов, равных с. n имеет целочисленный тип, c - char. • S.insert(i, T) - вставить содержимое строки T. T может быть объектом класса string или C-строкой. • S.insert(i, T, pos, count) - вставить символы строки T начиная с символа с индексом pos количеством count. Методы строк. Substr • S.substr(pos) - возвращает подстроку данной строки начиная с символа с индексом pos и до конца строки. • S.substr(pos, count) - возвращает подстроку данной строки начиная с символа с индексом pos количеством count или до конца строки, если pos + count > S.size(). Методы строк. Replace • Заменяет фрагмент строки на несколько равных символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первыми двумя параметрами являются два числа: pos и count. Из данной строки удаляется count символов, начиная с символа pos, и на их место вставляются новые символы. • S.replace(pos, count, n, c) - вставить n одинаковых символов, равных с. n имеет целочисленный тип, c - char. • S.replace(pos, count, T) - вставить содержимое строки T. T может быть объектом класса string или C-строкой. • S.replace(pos, count, T, pos2, count2) - вставить символы строки T начиная с символа с индексом pos количеством count. Методы строк. Find • Ищет в данной строке первое вхождение другой строки str. Возвращается номер первого символа, начиная с которого далее идет подстрока, равная строке str. Если эта строка не найдена, то возвращается константа string::npos (которая равна -1, но при этом является беззнаковой, то есть на самом деле является большим безннаковым положительным числом). • Если задано значение pos, то поиск начинается с позиции pos, то есть возвращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 - поиск осуществляется с начала строки. • S.find(str, pos = 0) - искать первое вхождение строки str начиная с позиции pos. Если pos не задано - то начиная с начала строки S. • S.find(str, pos, n) - искать в данной строке подстроку, равную первым n символам строки str. Значение pos должно быть задано. Методы строк. rfind • Ищет последнее вхождение подстроки ("правый" поиск). Способы вызова аналогичны способам вызова метода find.