Std string что это

Строки в языке C++ (класс string)

В языке C++ для удобной работы со строками есть класс string, для использования которого необходимо подключить заголовочный файл string.

Строки можно объявлять и одновременно присваивать им значения:

string S1, S2 = «Hello»;

Строка S1 будет пустой, строка S2 будет состоять из 5 символов.

Строки в языке C++ могут

Конструкторы строк

Конструкторы можно вызывать явно, например, так:

Неявно конструктор вызывается при объявлении строки с указанием дополнительных параметров. Например, так:

Подробней о конструкторах для строк читайте здесь.

Ввод-вывод строк

Строка выводится точно так же, как и числовые значения:

cout >» для объекта cin:

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

Арифметические операторы

Подробней о методе resize.

clear

Подробней о методе clear.

empty

Подробней о методе empty.

push_back

Подробней о методе push_back.

append

Добавляет в конец строки несколько символов, другую строку или фрагмент другой строки. Имеет много способов вызова.

Подробней о методе append.

erase

Подробней о методе erase.

insert

Подробней о методе insert.

substr

Подробней о методе substr.

replace

Заменяет фрагмент строки на несколько равных символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первыми двумя параметрами являются два числа: pos и count. Из данной строки удаляется count символов, начиная с символа pos, и на их место вставляются новые символы.

Подробней о методе replace.

Подробней о методе find.

rfind

Ищет последнее вхождение подстроки («правый» поиск). Способы вызова аналогичны способам вызова метода find.

Подробней о методе rfind.

find_first_of

Ищет в данной строке первое появление любого из символов данной строки str. Возвращается номер этого символа или значение string::npos.

find_last_of

Ищет в данной строке последнее появление любого из символов данной строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.

Подробней о методе find_last_of.

find_first_not_of

Ищет в данной строке первое появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.

find_last_not_of

Ищет в данной строке последнее появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.

c_str

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

Источник

Несколько подробностей об std::string

Недавно заинтересовался реализацией std::string в libstdc++. Не в связи с принятием нового стандарта, а чтобы разобраться. Благо требования к строковму типу почти не изменились.

Основным средством для анализа кода несомненно является метод пристального вглядывания, но чтобы сузить область вглядывывания и сделать процедуру более захватывающей можно реализовать для строки идиому «трассер» подсмотренную в «C++ Templates: The Complete Guide». Трассировка позволяет выявлять подозрительные интересные операции над строками.

выведет содержимое строки. Т.е. std::string — является, по сути, указателем на char.
Вобщем, эти и другие шокирующие поднобности под катом.

Структура

std::string декларируется как:
, в свою очередь, является псевдонимом для:

Определение basic_string выполнено в файлах c++/bits/basic_string.h c++/bits/basic_string.tcc.

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

Почему выбрана именно четверть — мне выяснить так и не удалось.
_S_terminal — символ конца строки он инициализируется конструктором без параметров при запуске программы.

Подсчет ссылок

(Upd: _GLIBCXX_FULLY_DYNAMIC_STRING никакого отношения к refcounting’у не имеют. Это простая оптимизация для того, чтобы не выделять память для пустых строк. Отключать её нужно в тех случаях когда у вас несколько экземпляров libstdc++ в процессе (так бывает на Windows) )

В целом эти ссылки просто переносят выделение памяти с вызова констркутора к моменту первой записи в строку и иногда дают о себе знать при работе в мультипоточном режиме. Helgrind и drd выдают нетривиальные подсказки по этому поводу.

Трассер

Структура X имеет одно регулярное поле класса char v; — его значение. Два статических — массив счетчиков и массив имен для этих счетчиков. Подсчитываются вызовы конструкторов, деструкторов, присваиваний, сравнений(==, X(b);1102000a = [](X y)->X(b);0212000>0003000


Т.к. калибровка выполняется в начале приложения, то в эту таблицу попадает конструктор статического терминального символа _S_terminal. Его конструктор посчитан в первой строке.
В следующей таблице показано конструирование пары массивов:

operationctorcopyassgndtorlsseqlcast
<0000000
X a[10];10000000
std::copy(ch,ch+10,a);00100000
X b[10] = <'o'>;10000000
std::copy(a,a+10,b);00100000
>00020000

Теперь перейдем к строкам. Назовем нашу трасситуемую строку так
Конструирование пустых строк, как и ожидалось, не производит операций над символами.

operationctorcopyassgndtorlsseqlcast
<0000000
const xs s1;0000000
xs s2(s1);0000000
xs s3 = s1;0000000
>0000000

Следующая таблица говорит сама за себя. Смутило, что при указании длины(s2) количество операций значительно меньше чем в случае s1. Более того строки конструируемые на основе s1 и s2 повели себя разным образом. Для s6 ленивое конструирование сработало, для s5 — нет. Заполняющий конструктор так вообще удивил — откуда-то взялись дополнительные копирования и деструкторы. (Upd: они взялись из передачи класса по значению)

operationctorcopyassgndtorlsseqlcast
<0000000
xs s1((X*)«1234567890»);11011110110
xs s2((X*)«1234567890»,7);0080000
xs s3(10,’a’);13114000
xs s4(s1.begin(), s1.begin()+7);0080000
xs s5(s2);0000000
s5[0]=’a’;0090000
xs s6(s1);00110000
s6[0]=’a’;0010000
xs s7(s1,1,5);0060000
xs s8=[]()->xs();6066060

Теперь несколько базовых операций. Неожиданно, результат для resize получился значительно хуже чем для reserve:

operationctorcopyassgndtorlsseqlcast
int a = s1.size();0000000
s1.resize(100);131024000
s2.reserve(100);0080000
s1.erase();0010000

Что из этого можно вынести? Ну во первых использовать reserve, а не resize, избегать присвоений и заполняющих конструкторов, воможно, что-то еще. Код работает и дает сходный результат для g++ 4.7.2, intel 13.0.1, clang 3.2, что было проверено здесь
После выхода из области видимости строки деструкторы для символов не вызываются. Возможно там и другие операции пропускаются (например используется memcmp вместо в цикле). Но и строка это не полноценный контейнер. Для строк метод трассеров позволяет получить приблизительную оценку количества операций. Для чистых контейнеров эта оценка должна быть строже.

Вот, почти все.
Во время исследования никто не пострадал. Источниками были
этот референс, файлы:
/usr/include/c++/4.7.2/strings
/usr/include/c++/4.7.2/bits/stringfwd.h
/usr/include/c++/4.7.2./bits/basic_string.h
/usr/include/c++/4.7.2./bits/basic_string.tcc
и gdb.

В качестве постскриптума и иллюстрации тожества метапрограммирования добавлю, что наш трассер можно использовать для оценки затрат на разбор строки в boost::spirit. На гитхабе выложен исходник трассера вместе с примером calc5.cpp из boost::spirit.

Upd1:
Спасибо хабражителю Khim за разъяснение ситуации с _GLIBCXX_FULLY_DYNAMIC_STRING, cо строками c++11 и их реализацией в libstdc++.

Upd2: Согласно стандарту basic_string может оперировать только с POD типами. Оказалось, что X не является POD типом. (он «standard layout class», но не «trivially copyable class» т.к. имеет явные конструкторы, деструктор и операторы присвоения)
Поэтому поведение класса basic_string является неопределенным, а весь это пост — ложь и провокация. 🙂
Что и подтвеждается невозможностью скомпилировать примеры с использованием стандартных библиотек отличных от gnu libstdc++. (clang 3.2 c libc++ 1.0 и msvc из vs2012)

Источник

Урок №200. Строковые классы std::string и std::wstring

Обновл. 15 Сен 2021 |

Стандартная библиотека C++ содержит много полезных классов, но одним из наиболее полезных является std::string. std::stringstd::wstring) — это строковый класс, который позволяет выполнять операции присваивания, сравнения и изменения строк. На следующих нескольких уроках мы подробно рассмотрим строковые классы Стандартной библиотеки С++.

Примечание: Строки C-style обычно называют «строками C-style», тогда как std::string (и std::wstring) обычно называют просто «строками».

Зачем нужен std::string?

Мы уже знаем, что строки C-style используют массивы типа char для хранения целой строки. Если вы попытаетесь что-либо сделать со строками C-style, то вы очень быстро обнаружите, что работать с ними трудно, запутаться легко, а проводить отладку сложно.

Строки C-style имеют много недостатков, в первую очередь связанных с тем, что вы должны самостоятельно управлять памятью. Например, если вы захотите поместить строку Hello! в буфер, то вам сначала нужно будет динамически выделить буфер правильной длины:

Не забудьте учесть дополнительный символ для нуль-терминатора! Затем вам нужно будет скопировать значение:

И здесь вам нельзя прогадать с длиной буфера, иначе произойдет переполнение! И, конечно, поскольку строка выделяется динамически, то вы должны её еще и правильно удалить:

Не забудьте использовать форму оператора delete, которая работает с массивами, а не обычную форму оператора delete.

Суть в том, что работая со строками C-style, вам нужно помнить множество придирчивых правил о том, что делать безопасно, а что — нет; запоминать много функций, таких как strcat() и strcmp(), чтобы использовать их вместо интуитивных операторов; а также самостоятельно выполнять управление памятью.

К счастью, язык C++ предоставляет гораздо лучший способ для работы со строками: классы std::string и std::wstring. Используя такие концепции С++, как конструкторы, деструкторы и перегрузку операторов, std::string позволяет создавать и манипулировать строками в интуитивно понятной форме и, что не менее важно, выполнять это безопасно! Никакого управления памятью, запоминания странных названий функций и значительно меньшая вероятность возникновения ошибок/сбоев.

Класс std::string

Весь функционал класса std::string находится в заголовочном файле string:

Источник

BestProg

Содержание

Поиск на других ресурсах:

1. Какое назначение класса string в программах на C++?
2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?

Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.

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

С объектами класса string можно использовать нижеследующие операторы

Пример, который демонстрирует использование вышеприведенных операторов

6. Содержит ли класс string конструкторы?

Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:

7. Примеры инициализации с помощью конструкторов

Ниже приведены примеры инициализации переменных типа string

Чтобы присвоить одну строку другой, можно применить один из двух методов:

Функция assign() имеет несколько перегруженных реализаций.

Первый вариант – это вызов функции без параметров

В этом случае происходит простое присваивание одной строки другой.

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

Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s :

Пример.

Однако, функция append() хорошо подходит, если нужно добавлять часть строки.

Функция имеет следующие варианты реализации:

Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):

В вышеприведенных функциях:

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

Для удаления символов из вызывающей строки используется функция erase() :

Пример.

В классе string поиск строки в подстроке можно делать двумя способами, которые отличаются направлением поиска:

Прототип функции find() имеет вид:

Прототип функции rfind() имеет вид:

Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()

Прототип функции compare() :

Пример. Демонстрация работы функции compare() :

Пример 2.

Для определения количества символов в строке используется функция length() без параметров.

Источник

Функции

getline

Извлекает строки из входного потока, последовательно по одной строке.

Параметры

in_stream
Входной поток, из которого извлекается строка.

str
Строка, в которую считываются символы из входного потока.

delimiter
Разделитель строк.

Возвращаемое значение

Комментарии

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

Извлечение останавливается при возникновении одного из следующих условий.

При возникновении исключения in_stream и str остаются в допустимом состоянии.

Пример

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

Возвращаемое значение

Комментарии

Преобразует последовательность символов в число с плавающей запятой.

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

Возвращаемое значение

Комментарии

Преобразует последовательность символов в целое число.

Возвращаемое значение

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Комментарии

Функция stoi преобразует последовательность символов в stoi в значение типа int и возвращает значение. Например, если передать последовательность символов «10», stoi возвращает целочисленное значение 10.

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

Длинное целое значение.

Комментарии

stold

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

Возвращаемое значение

Комментарии

stoll

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

Комментарии

stoul

Преобразует последовательность символов в длинное целое без знака.

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

Длинное целое значение без знака.

Комментарии

stoull

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

Комментарии

Меняет местами массивы символов двух строк.

Параметры

left
Одна строка, элементы которой должны быть заменены элементами другой строки.

right
Другая строка, элементы которой будут заменены на элементы первой строки.

Комментарии

Пример

to_string

Параметры

value
Преобразуемое значение.

Возвращаемое значение

Комментарии

«%d» Если value имеет тип int

«%u» Если value имеет тип unsigned int

«%ld» Если value имеет тип long

«%lu» Если value имеет тип unsigned long

«%lld» Если value имеет тип long long

«%llu» Если value имеет тип unsigned long long

«%f» Если value имеет тип float или double

«%Lf» Если value имеет тип long double

to_wstring

Преобразует значение в расширенную строку.

Параметры

value
Преобразуемое значение.

Возвращаемое значение

Расширенная строка, представляющая значение.

Комментарии

L»%d» Если value имеет тип int

L»%u» Если value имеет тип unsigned int

L»%ld» Если value имеет тип long

L»%lu» Если value имеет тип unsigned long

L»%lld» Если value имеет тип long long

L»%llu» Если value имеет тип unsigned long long

L»%f» Если value имеет тип float или double

L»%Lf» Если value имеет тип long double

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *