Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 Строки_лекция.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
157.7 Кб
Скачать

Тип данных string стандартной библиотеки

Тип данных string стандартной библиотеки лишен этих недостатков, но может проигрывать массивам символов в эффективности. Основные действия со строками выполняются в нем с помощью операций и методов, а длина строки изменяется динамически в соответствии с потребностями. Для использования класса необходимо подключить к программе заголовочный файл <string>.

Рассмотрим пример:

#include <cstring>

#include <string>

#include <iostream>

using namespace std;

int main ()

{

char c1[80], c2[80], c3[80];

// Строки с завершающим нулем

string s1, s2, s3;

// Присваивание строк

strcpy(c1, "old string one");

strcpy(c2, c1);

s1 = "new string one";

s2 = s1;

// Конкатенация строк

strcpy(c3, c1);

strcpy(c3, c2);

s3 = s1 + s2;

// Сравнение строк

if (strcmp(c2, c3) < 0 ) cout<<c2<<endl;

else cout<<c3<<endl;

if (s2<s3) cout<<s2<<endl;

else cout<<s3<<endl;

return 0;

}

Как видно из примера, выполнение любых действий со строками старого стиля требует использования функций и менее наглядно. Кроме того, необходимо проверять, достаточно ли места в строке-приемнике при копировании, то есть фактически код работы со строками старого стиля должен быть еще более длинным.

Строки типа string защищены от выхода информации за их границы и с ними можно работать так же, как с любым встроенным типом данных, то есть с помощью операций. (Учебник, страница 286)

Вот пример использования:

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s0 = "abcde"; string s1 = " fg";

// Конкатенация строк

string s = s0 + s1; cout<<s<<"\n";

// Получаем символ на определенном месте.

char ch0=s0.at(1); cout<<ch0<<"\n";

char ch1 = s0[3]; cout<<ch1<<"\n";

// Выясняем, не пустая ли строка

if (s0.empty()) cout << "String is empty"<<"\n";

else cout << "String isn't empty"<<"\n";

// Обмен значения двух строк.

swap(s0, s1);

// Присваиваем и сравниваем 2 строки.

s1 = s0;

if(s1 == s0) cout << "Strings are equal"<<"\n";

else cout << "Strings are not equal"<<"\n";

// Чтение введенной с клавиатуры строки.

getline(cin, s1); cout<<s1<<" ";

// Получение длины строки.

cout<<s1.length();

}

Как вы видите, работать со строками через класс string достаточно удобно - вы можете выполнять конкатенацию (сложение) строк с помощью обычного оператора +, можете брать символ в определенном месте строки с помощью оператора [] (или другим способом - с помощью метода at), можете использовать привычные операторы =, = =, != для присваивания и сравнения строк.

Также имеются методы для получения длины строки, для выяснения, не пустая ли это строка и др.

Обратите внимание также на весьма полезный метод getline, который позволяет прочитать строку из определенного потока (с клавиатуры в нашем примере).

Две строки равны, если:

Их размер одинаков, и каждый символ в позиции i одной строки равен символу в позиции i в другой строке.

Операторы

складывают строки, присваивают строкам значение, вводят/выводят строки, сравнивают строки

append

добавляет строку или символы к строке

assign

присваивает строке значение строк символов или других строк C++

at

возвращает символ, стоящий в некоторой позиции

begin

возвращает итератор на начало строки

c_str

возвращает строку в виде немодифицируемого массива символов (как в C)

capacity

возвращает количество символов, которые могут поместиться в строку

clear

удаляет все символы из строки

compare

сравнивает две строки

copy

копирует символы из строки в массив

data

возвращает указатель на первый символ строки

empty

возвращает true если в строке нет символов

end

возвращает итератор, установленный после последнего символа строки

erase

удаляет символы из строки

find

ищет символы в строке

find_first_not_of

находит первый символ, отличный от

find_first_of

находит первый символ схожий с

find_last_not_of

находит последний символ, отличный от

find_last_of

находит последний символ, схожий с

getline

читает из потока ввода в строку

insert

вставляет символы в строку

length

возвращает длину строки

max_size

возвращает максимальное количество символов, которые могут содержаться в строке

npos

специальное значение, означающее «не найдено» или «все оставшиеся символы»

push_back

добавляет символ в конец строки

rbegin

возвращает обратный итератор на конец строки

rend

возвращает обратный итератор на начало строки

replace

заменяет символы в строке

reserve

устанавливает минимальную вместимость строки

resize

меняет размер строки

rfind

находит последнее вхождение подстроки

size

возвращает количество символов в строке

substr

возвращает определённую подстроку

swap

меняет две строки содержимым

Решите задачу:

Задача 3. Написать программу сравнения двух строк. Разбор задачи. Чтобы понять, что означает одна строка "больше" или "меньше", чем другая строка, рассмотрим процесс расстановки имен по алфавиту. Вы, без сомнения, поставили бы "Jones" перед "Smith", потому что в алфавите J раньше S. Но как компьютер узнает о порядке следования букв? Помните? - все символы представляются внутри компьютера как численные коды; когда компьютер сравнивает две строки, он на самом деле сравнивает численные коды символов в строке. (Замечание: коды символов упорядочены по алфавиту только для латинских букв, к кириллице это, к сожалению, не относится)

#include <string>

string st( "Цена бутылки воды\n" );

Длину строки возвращает функция size() (длина не включает завершающий нулевой символ).

cout << "Длина "

<< st

<< ": " << st.size()

<< " символов, включая символ новой строки\n";

Вторая форма определения строки задает пустую строку:

string st2; // пустая строка

Как мы узнаем, пуста ли строка? Конечно, можно сравнить ее длину с 0:

if ( ! st.size() )

// правильно: пустая

Однако есть и специальный метод empty(), возвращающий true для пустой строки и false для непустой:

if ( st.empty() )

// правильно: пустая

Третья форма конструктора инициализирует объект типа string другим объектом того же типа:

string st3( st );

Строка st3 инициализируется строкой st. Как мы можем убедиться, что эти строки совпадают? Воспользуемся оператором сравнения (==):

if ( st == st3 )

// инициализация сработала

Как скопировать одну строку в другую? С помощью обычной операции присваивания:

st2 = st3; // копируем st3 в st2

Для конкатенации строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки:

string s1( "hello, " );

string s2( "world\n" );

Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом:

string s3 = s1 + s2;

Если же мы хотим добавить s2 в конец s1, мы должны написать:

s1 += s2;

К отдельным символам объекта типа string, как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания:

string str( "fa.disney.com" );

int size = str.size();

for ( int ix = 0; ix < size; ++ix )

if ( str[ ix ] == '.' ) str[ ix ] = '_';

Вот и все, что мы хотели сказать о классе string прямо сейчас. На самом деле, этот класс обладает еще многими интересными свойствами и возможностями. Скажем, предыдущий пример реализуется также вызовом одной-единственной функции replace():

replace( str.begin(), str.end(), '.', '_' );

Эта функция пробегает диапазон от begin() до end(), которые возвращают указатели на начало и конец строки, и заменяет элементы, равные третьему своему параметру, на четвертый.