§15 Операции с объектом класса string

Конкатенация. Метод append()

Конкатенацией называется объединение двух и более строк, а также строк и строковых литералов. Для этого используется перегруженная операция "+" (сложения). Например:

string S1 = "Это";
string S2 = "новая";
string S3 = "строка";
string newS = S1 + " " + S2 + " " + S3;
cout << newS << endl;

Примечание. В выражении с конкатенацией есть одно требование: в выражении должен участвовать хотя бы один объект класса string.
Возникает вопрос, можно ли использовать сокращенное присваивание: "+="? Да, можно. Это также перегруженная операция и она трактуется как "добавление в конец" строки.

append

Фактически операция "+=" может, в некоторых случаях, заменить существующий метод append(). Однако данный метод гибче, так как позволяет добавлять элементы различными способами, например:
1. подстроку из строки other_str в промежутке [pos, pos + count):

myStr.append(other_str, pos, count);

2. подстроку определённую итераторами first и last:

myStr.append(firs, last);

3. или более лаконичное добавление count символов ch:

myStr.append(count, ch);

Методы-модификаторы строки

Класс string содержит большое количество функций-членов (методов) для изменения строки. Этих функций гораздо больше, чем в других контейнерах. Объясняется это тем, что данные методы обеспечивают тот необходимый функционал, который соответствует функционалу для работы с C-строкой. Эти методы, в совокупности, называются модификаторами, так как изменяют, различным образом, символьный массив. Рассмотреть всё разнообразие работы с этими методами в рамках нашего курса не представляется возможном. С точки зрения эффективности, эти методы могут влиять на производительность программы негативно, так как в результате может произойти явление прераспределения памяти. Перечислим ниже наиболее важные из этих методов.

replace

Этот модификатор заменяет в исходной строке подстроку строкой или указанным диапазоном. Подстрока замены не обязательно должна иметь тот же размер, что и заменяемая подстрока.
1. Замена подстроки, указанную диапазоном [pos, pos + count), на строку other_str (other_str может быть как объектом класса string, так и C-строкой):

myStr.replace(pos, count, other_str)

или с указанием диапазона из other_str

myStr.replace(pos, count, other_str, pos2, count2)

2. Подстроку для замены можно получить и с помощью итераторов:

myStr.replace(first1, last1, first2, last2)

3. Наконец, можно заменить count символами ch:

myStr.replace(first, last, count, ch)

resize

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

myStr.resize(count, ch)

clear

Метод clear() удаляет все символы строки. Но объем массива (capacity) остается неизменным.

assign

Этот метод заменяет содержимое строки
1. Либо строкой other_str (other_str может быть как объектом класса string, так и C-строкой):

myStr.assign(other_str)

2. либо диапазоном на который указывают итераторы:

myStr.assign(first, last)

3. либо (что аналогично предыдущему) подстрокой [pos, pos + count) из строки other_str. В этом случае pos не должен превышать myStr.size().

myStr.assign(other_str, pos, count)

Рассмотрим пример. Дана строка S1. Эта строка делится пополам. Первая половина строки помещается в строку S2, а вторая - в строку S3. Заменить исходную строку на строку, состоящую из 20 символов '*'. Вывести строки S1, S2 и S3. Изменить строки S1 и S2 так, чтобы первые семь символов строки S2 и последние семь символов строки S3 были заменены на символы строки S1. Вывести модифицированные строки S2 и S3.
Программа 15.1

#include <iostream>
#include <string>
using namespace std;

int main() {
	string S1("The C++ programming language has support for string handling, "
			"mostly implemented in its standard library.");
	string S2, S3;
	auto first = S1.сbegin();
	auto last = S1.сend();
	// Используем итераторы
	S2.assign(first, last - S1.size() / 2);
	S3.assign(first + S1.size() / 2, last);
	cout << "S1 => " << S1 << endl;
	S1.assign(20, '*');
	cout << "S2 => " << S2 << "\n"
		 << "S3 => " << S3 << "\n"
		 << "S1 => " << S1 << endl;
	// Используем диапазоны
	S2.replace(0, 7, S1);
	S3.replace(S3.size() - 7, 7, S1);
	cout << "S2 => " << S2 << "\n"
		 << "S3 => " << S3 << endl;
	return 0;
}
S1 => The C++ programming language has support for string handling, mostly implemented in its standard library.
S2 => The C++ programming language has support for string h
S3 => handling, mostly implemented in its standard library.
S1 => ********************
S2 => ******************** programming language has support for string h
S3 => handling, mostly implemented in its standard l********************

Примечание. Обратите внимание на конкатенацию строковых литералов. Если строка слишком длинная ее можно разделить, при этом каждая часть должна заключаться в отдельные двойные кавычки. Символы конца строки вне двойных кавычек будут проигнорированы.

Методы empty, erase, insert, find и константа npos

Хотя erase() и insert() формально являются модификаторами, но, в тоже время, часто используются в программе с методом find(), поэтому мы рассмотрим работу с этими методами в этой части занятия.

empty

Метод empty() проверяет строку на отсутствие в ней символов. Это логическая функция, она возвращает true, если строка пуста, иначе false().

erase

Этот метод удаляет указанные символы из строки. erase() может использоваться в двух вариантах:

myStr.erase(it);
myStr.erase(first, last);

Первый вариант удаляет символ в позиции итератора, второй - в диапазоне [first, last). Оба варианта возвращают итератор, указывающий на символ, следующий за последним удаленным символом.

insert

Вставляет символ, определенное количество символов или диапазон символов в позицию итератора it:

myStr.insert(it, ch);
myStr.insert(it, count, ch);
myStr.insert(it, first, last);

Во всех случаях возвращается итератор вставки (в позиции следующей за последним вставленным символом).

find

find() находит первую подстроку, равную переданной строке, подстроке или символу (ch), начиная с позиции pos, необязательный аргумент count - первые count символов строки other_str (other_str может быть как объектом класса string, так и C-строкой):

myStr.find(other_str, pos);
myStr.find(other_str, pos);
myStr.find(other_str, pos, count);

Метод возвращает позицию первого символа найденной подстроки или npos (см. ниже), если подстрока не найдена.

Константа string::npos

Это специальное значение, равное максимальному значению, которое может предоставить тип size_type. Точный смысл данного значения зависит от контекста, но, как правило, оно используется либо как индикатор конца строки в функциях, которые ожидают позицию символа (программы 15.2 и 15.3), либо как индикатор ошибки в функциях, которые возвращают позицию в строке (программа 15.2).
Пример задачи. Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0. Если совпадающих подстрок нет, то вывести строку S без изменений.
Программа 15.2

#include <iostream>
#include <string>
using namespace std;

int main() {
	string S, S0;
	cout << "Введите строку" << endl;
	getline(cin, S);
	cout << "Введите подстроку" << endl;
	getline(cin, S0);
	if (S.find(S0) == string::npos)
		cout << S << endl;
	else {
		while (S.find(S0) != string::npos){
			auto pos = S.find(S0);
			S.erase(pos, S0.size());
		}
		cout << S << endl;
	}
	return 0;
}
Введите строку
wwwqqwwwqqqwwwqqqqwww
Введите подстроку
qq
wwwwwwqwwwwww

Методы copy, substr и swap

Эти три метода предназначены для копирования.

copy

Метод copy() копирует подстроку, заданную диапазоном [pos, pos + count), в строку символов, на которую указывает other_str. pos не должен быть >= size().

myStr.copy(other_str, count, pos)
substr

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

other_str = myStr.substr(pos, count)
swap

Метод swap() позволяет обмениваться содержимым между двумя строками myStr и other_str.

myStr.swap(othe_str)

Рассмотрим пример задачи. Даны целые положительные числа N1 и N2 и строки S1 и S2. Получить из этих строк новую строку, содержащую первые N1 символов строки S1 и последние N2 символов строки S2 (в указанном порядке). Произвести обмен элементами между строками S1 и S2. Вывести измененные строки.
Программа 15.3

#include <iostream>
#include <string>
using namespace std;

int main() {
	string S1, S2, S3;
	size_t N1, N2;
	cout << "S1 => ";
	getline(cin, S1);
	cout << "S2 => ";
	getline(cin, S2);
	cout << "N1 = "; cin >> N1;
	cout << "N2 = "; cin >> N2;
	S3 = S1.substr(0, N1) +
		 S2.substr(S2.size() - N2, string::npos);
	S1.swap(S2);
	cout << "S3 => "
		 << S3 << "\n"
		 << "S1 => "
		 << S1 << "\n"
		 << "S2 => "
		 << S2 << endl;
	return 0;
}


Print Friendly, PDF & Email

Comments are closed