Содержание

Слайд 3

https://radioprog.ru/post/1320

В какой области памяти хранится s (все в стеке или в стеке

https://radioprog.ru/post/1320 В какой области памяти хранится s (все в стеке или в
только указатель, а основная часть в куче), каков ее размер (всегда переопределяется как у динамического массива или выделяется сразу много места), хранятся ли там только символы в привычном однобайтном виде или есть еще какая-то информация о строке, в каком порядке хранятся байты (от младшего к старшему или наоборот)???
Рассмотрим выделение памяти под строку

Слайд 4

После того, как вы создали строку, часто бывает полезно узнать ее длину.

После того, как вы создали строку, часто бывает полезно узнать ее длину.
Здесь в игру вступают операции с длиной и емкостью.
Длина строки
Длина строки – это довольно просто, это количество символов в строке. Для определения длины строки есть две идентичные функции:
size_type string::length() const
size_type string::size() const
Обе эти функции возвращают текущее количество символов в строке, исключая завершающий ноль.
Пример кода:
string sSource("012345678");
cout << sSource.length() << endl;
Вывод:
9

Слайд 5

Хотя, чтобы определить, есть ли в строке какие-либо символы или нет, можно

Хотя, чтобы определить, есть ли в строке какие-либо символы или нет, можно
использовать length(), но более эффективно использовать функцию empty():
bool string::empty() const
Возвращает true, если в строке нет символов, иначе – false.
Пример кода:
string sString1("Not Empty");
cout << (sString1.empty() ? "true" : "false") << endl;
string sString2; // пустая
cout << (sString2.empty() ? "true" : "false") << endl;
Вывод:
false
true

Слайд 6

Есть еще одна функция, связанная с размером, которую вы, вероятно, никогда не

Есть еще одна функция, связанная с размером, которую вы, вероятно, никогда не
будете использовать, но мы опишем ее здесь для полноты картины:
size_type string::max_size() const
Возвращает максимальное количество символов, которое может содержать строка. Это значение будет варьироваться в зависимости от операционной системы и архитектуры системы.
Пример кода:
string sString("MyString");
cout << sString.max_size() << endl;
Вывод:
4294967294

Слайд 7

Емкость строки
Емкость (вместимость) строки показывает, сколько памяти выделено объектом строки для хранения

Емкость строки Емкость (вместимость) строки показывает, сколько памяти выделено объектом строки для
ее содержимого. Это значение измеряется в строковых символах, исключая символ завершающего нуля. Например, строка с емкостью 8 может содержать 8 символов.
size_type string::capacity() const
Возвращает количество символов, которое строка может хранить без перераспределения памяти.
Пример кода:
string sString("01234567");
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;
Вывод:
Length: 8
Capacity: 15

Слайд 8

Обратите внимание, что емкость больше, чем длина строки! Хотя длина нашей строки

Обратите внимание, что емкость больше, чем длина строки! Хотя длина нашей строки
равна 8, на самом деле она занимала достаточно памяти для 15 символов! Зачем так сделано?
Здесь важно понимать, что если пользователь хочет поместить в строку больше символов, чем позволяет ее емкость, то для получения большей емкости строка должна быть перераспределена в памяти. Например, если строка имеет длину и емкость 8, то добавление любых символов в строку приведет к переразмещению объекта в памяти. Сделав емкость больше размера фактической строки, пользователь получил некоторое буферное пространство для расширения строки до необходимости перераспределения.
Как оказалось, перераспределение – это плохо по нескольким причинам:
Во-первых, перераспределение строки относительно дорого. Сначала необходимо выделить новую память. Затем каждый символ в строке необходимо скопировать в новую память. Если строка большая, это может занять много времени. Наконец, необходимо освободить старую память. Если вы выполняете много перераспределений, этот процесс может значительно замедлить работу вашей программы.
Во-вторых, всякий раз, когда строка перераспределяется, адрес содержимого строки в памяти изменяется на новое значение. Это означает, что все ссылки, указатели и итераторы строки становятся недействительными!

Слайд 9

Обратите внимание, что строки не всегда размещаются с емкостью, превышающей длину. Рассмотрим

Обратите внимание, что строки не всегда размещаются с емкостью, превышающей длину. Рассмотрим
следующую программу:
string sString("0123456789abcde");
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;
Эта программа выводит:
Length: 15
Capacity: 15
Результаты могут отличаться в зависимости от компилятора.

Слайд 10

Давайте добавим к строке один символ и посмотрим, как изменится емкость:
string sString("0123456789abcde");
cout

Давайте добавим к строке один символ и посмотрим, как изменится емкость: string
<< "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;
// Теперь добавим новый символ
sString += "f";
cout << "Length: " << sString.length() << endl;
cout << "Capacity: " << sString.capacity() << endl;
Это дает следующий результат:
Length: 15
Capacity: 15
Length: 16
Capacity: 31

Слайд 11

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

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

#include
#include
#include // для rand() и srand()
#include // для time()
using namespace std;
int main()
{
std::srand(std::time(nullptr)); // инициализация генератора случайных чисел
string sString{}; // длина 0
sString.reserve(64); // резервируем 64 символа
// Заполняем строку случайными строчными буквами
for (int nCount{ 0 }; nCount < 64; ++nCount)
sString += 'a' + std::rand() % 26;
cout << sString;
}
Результат этой программы будет меняться каждый раз. Вот результат одного выполнения:
wzpzujwuaokbakgijqdawvzjqlgcipiiuuxhyfkdppxpyycvytvyxwqsbtielxpy
Вместо того чтобы перераспределять sString несколько раз, мы устанавливаем емкость один раз, а затем заполняем строку. Это может очень влиять на производительность при формировании больших строк с помощью конкатенации.

Слайд 18

#include
#include
using namespace std;
int main () {
string str1

#include #include using namespace std; int main () { string str1 =
= "Привет";
string str2 = "Мир";
string str3;
int len;
// копируем str1 в str3
str3 = str1;
cout << "str3:" << str3 << endl;
// объединяет str1 и str2
str3 = str1 + str2;
cout << "str1 + str2:" << str3 << endl;
// общая длина str3 после конкатенации
len = str3.size ();
cout << "str3.size ():" << len << endl;
return 0;
}

Слайд 19

Лотосы
#include
#include
using namespace std;
int main()
{ int i;
string s1 = "Розовые лотосы

Лотосы #include #include using namespace std; int main() { int i; string
удивительно красивы";
string s2 = "можно ";
string s3 = "есть ";
string s4 =", кажется,";
//string s5=s1+" "+s2+" "+s3+" "+s4;
//cout <//cout <s1.erase(29,22);
cout <s1.replace (29,13,s2);
cout <s1.append(s3);
cout <s1.insert(28,s4);
cout <i=s1.size ();
cout < // cout<<"Hello World";
return 0;
}

Слайд 20

Дана Фраза: Розовые лотосы удивительно красивы. https://server.179.ru/tasks/cpp/total/161.html

Создайте фразу : Розовые лотосы, кажется,

Дана Фраза: Розовые лотосы удивительно красивы. https://server.179.ru/tasks/cpp/total/161.html Создайте фразу : Розовые лотосы, кажется, можно есть.
можно есть.