- Строки в языке C++ (класс string)
- Конструкторы строк
- Ввод-вывод строк
- Арифметические операторы
- clear
- empty
- push_back
- append
- erase
- insert
- substr
- replace
- rfind
- find_first_of
- find_last_of
- find_first_not_of
- find_last_not_of
- c_str
- Что означает string :: npos в этом коде?
- Что означает string :: npos в этом коде?
- 11 ответов
- Что означает string:: npos
- 9 ответов
Строки в языке C++ (класс string)
В языке C++ для удобной работы со строками есть класс string, для использования которого необходимо подключить заголовочный файл string.
Строки можно объявлять и одновременно присваивать им значения:
string S1, S2 = «Hello»;
Строка S1 будет пустой, строка S2 будет состоять из 5 символов.
К отдельным символам строки можно обращаться по индексу, как к элементам массива или C-строк. Например S[0] — это первый символ строки.
Для того, чтобы узнать длину строки можно использовать метод size() строки. Например, последний символ строки S это S[S.size() — 1 ].
Строки в языке C++ могут
Конструкторы строк
Строки можно создавать с использованием следующих конструкторов:
string() — конструктор по умолчанию (без параметров) создает пустую строку.
string(string & S) — копия строки S
string( size_t n, char c) — повторение символа c заданное число n раз.
string(size_t c) — строка из одного символа c .
string(string & S, size_t start, size_t len) — строка, содержащая не более, чем len символов данной строки S , начиная с символа номер start .
Конструкторы можно вызывать явно, например, так:
В этом примере явно вызывается конструктор string для создания строки, состоящей из 10 символов ‘z’ .
Неявно конструктор вызывается при объявлении строки с указанием дополнительных параметров. Например, так:
Подробней о конструкторах для строк читайте здесь.
Ввод-вывод строк
Строка выводится точно так же, как и числовые значения:
cout >» для объекта cin:
В этом случае считывается строка из непробельных символов, пропуская пробелы и концы строк. Это удобно для того, чтобы разбивать текст на слова, или чтобы читать данные до конца файла при помощи while (cin >> S) .
Можно считывать строки до появления символа конца строки при помощи функции getline. Сам символ конца строки считывается из входного потока, но к строке не добавляется:
Арифметические операторы
Со строками можно выполнять следующие арифметические операции:
= — присваивание значения.
+= — добавление в конец строки другой строки или символа.
+ — конкатенация двух строк, конкатенация строки и символа.
== , != — посимвольное сравнение.
, > , , >= — лексикографическое сравнение.
То есть можно скопировать содержимое одной строки в другую при помощи операции S1 = S2, сравнить две строки на равенство при помощи S1 == S2, сравнить строки в лексикографическом порядке при помощи S1 S.resize(n) — Изменяет длину строки, новая длина строки становится равна n. При этом строка может как уменьшится, так и увеличиться. Если вызвать в виде S.resize(n, c) , где c — символ, то при увеличении длины строки добавляемые символы будут равны c.
Подробней о методе resize.
clear
S.clear() — очищает строчку, строка становится пустой.
Подробней о методе clear.
empty
S.empty() — возвращает true, если строка пуста, false — если непуста.
Подробней о методе empty.
push_back
S.push_back(c) — добавляет в конец строки символ c, вызывается с одним параметром типа char.
Подробней о методе push_back.
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.
Подробней о методе append.
erase
S.erase(pos) — удаляет из строки S с символа с индексом pos и до конца строки.
S.erase(pos, count) — удаляет из строки S с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().
Подробней о методе erase.
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.
Подробней о методе insert.
substr
S.substr(pos) — возвращает подстроку данной строки начиная с символа с индексом pos и до конца строки.
S.substr(pos, count) — возвращает подстроку данной строки начиная с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().
Подробней о методе substr.
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.
Подробней о методе replace.
Ищет в данной строке первое вхождение другой строки 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 должно быть задано.
Подробней о методе find.
rfind
Ищет последнее вхождение подстроки («правый» поиск). Способы вызова аналогичны способам вызова метода find.
Подробней о методе rfind.
find_first_of
Ищет в данной строке первое появление любого из символов данной строки str. Возвращается номер этого символа или значение string::npos.
Если задано значение pos, то поиск начинается с позиции pos, то есть возращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 — поиск осуществляется с начала строки.
S.find_first_of(str, pos = 0) — искать первое входение любого символа строки str начиная с позиции pos. Если pos не задано — то начиная с начала строки S.
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-строку.
Источник
Что означает string :: npos в этом коде?
Что означает фраза std::string::npos в следующем фрагменте кода?
Значит не найдено.
Обычно это определяется так:
Лучше сравнивать с npos вместо -1, потому что код более разборчивый.
string::npos — это константа (вероятно -1 ), представляющая непозицию. Он возвращается методом, find когда шаблон не найден.
В документе string::npos говорится:
npos — это статическое значение константы члена с максимально возможным значением для элемента типа size_t.
В качестве возвращаемого значения оно обычно используется для обозначения сбоя.
Эта константа фактически определяется со значением -1 (для любого признака), которое, поскольку size_t является целочисленным типом без знака, становится максимально возможным представимым значением для этого типа.
size_t является беззнаковой переменной, поэтому ‘unsigned value = — 1’ автоматически делает ее максимально возможным значением для size_t : 18446744073709551615
std::string::npos — это индекс, определяемый реализацией, который всегда выходит за пределы любого std::string экземпляра. Различные std::string функции возвращают или принимают его, чтобы сигнализировать о конце строки. Обычно это какой-то беззнаковый целочисленный тип, и его значение обычно std::numeric_limits ::max () (благодаря стандартным целочисленным предложениям) обычно сопоставимо с -1 .
мы должны использовать string::size_type тип возвращаемого значения функции поиска, иначе сравнение с string::npos может не работать. size_type , который определяется распределителем строки, должен быть unsigned целочисленным типом. Распределитель по умолчанию, распределитель, использует тип size_t как size_type . Поскольку -1 он преобразуется в целочисленный тип без знака, npos является максимальным беззнаковым значением его типа. Однако точное значение зависит от точного определения типа size_type . К сожалению, эти максимальные значения различаются. Фактически, (unsigned long)-1 отличается от (unsigned short)- 1, если размер типов отличается. Таким образом, сравнение
может дать false, если idx имеет значение -1 и idx и string::npos имеет разные типы:
Один из способов избежать этой ошибки — проверить, не завершился ли поиск напрямую:
Однако часто вам нужен индекс соответствующей позиции символа. Таким образом, еще одно простое решение — определить собственное значение со знаком для npos:
Теперь сравнение выглядит немного иначе и даже удобнее:
Источник
Что означает string :: npos в этом коде?
Что означает фраза std::string::npos в следующем фрагменте кода?
11 ответов
Значит не найдено.
Обычно это определяется так:
Лучше сравнивать с npos вместо -1, потому что код более разборчивый.
string::npos — это константа (вероятно, -1 ), представляющая непозицию. Он возвращается методом find , когда шаблон не найден.
В документе для string::npos говорится:
npos — это статическое значение константы члена с максимально возможным значением для элемента типа size_t.
В качестве возвращаемого значения оно обычно используется для обозначения сбоя.
Эта константа фактически определяется со значением -1 (для любого признака), которое, поскольку size_t является целочисленным типом без знака, становится наибольшим возможным представимым значением для этого типа.
size_t — беззнаковая переменная, поэтому ‘unsigned value = — 1’ автоматически делает ее максимально возможным значением для size_t : 18446744073709551615
std::string::npos — это определяемый реализацией индекс, который всегда выходит за пределы любого экземпляра std::string . Различные функции std::string возвращают его или принимают, чтобы сигнализировать о конце строки. Обычно это какой-то беззнаковый целочисленный тип, и его значение обычно std::numeric_limits ::max () , которое (благодаря стандартным целочисленным предложениям) обычно сопоставимо с -1 .
found будет npos в случае невозможности найти подстроку в строке поиска.
Мы должны использовать string::size_type для типа возвращаемого значения функции поиска, иначе сравнение с string::npos может не работать. size_type , который определяется распределителем строки, должен быть unsigned интегральный тип. Распределитель по умолчанию, распределитель, использует тип size_t как size_type . Поскольку -1 преобразованный в беззнаковый целочисленный тип, npos является максимальным беззнаковым значением этого типа. Однако, точное значение зависит от точного определения типа size_type . К сожалению, эти максимальные значения различаются. Фактически, (unsigned long)-1 отличается от (unsigned short)- 1, если размер типы различаются. Таким образом, сравнение
Может дать false, если idx имеет значение -1 , а idx и string::npos имеют разные типы:
Один из способов избежать этой ошибки — проверить, не завершился ли поиск напрямую:
Однако часто вам нужен индекс позиции совпадающего символа. Таким образом, еще одно простое решение — определить собственное подписанное значение для npos:
Теперь сравнение выглядит немного иначе и даже удобнее:
Он возвращается строковыми функциями, указывающими на ошибку / не найдено и т. Д.
Ответ для наших дней C ++ 17, когда у нас есть std::optional :
Если вы немного прищурились и притворились, что std::string::find() возвращает std::optional (что вроде как должно . ) — тогда условие становится:
Значение string :: npos — 18446744073709551615. Это значение возвращается, если строка не найдена.
Статическая константа size_t npos = -1;
Максимальное значение для size_t
Npos — это статическое значение константы члена с максимально возможным значением для элемента типа size_t.
Это значение, когда оно используется в качестве значения параметра len (или subblen) в строковых функциях-членах, означает «до конца строки».
В качестве возвращаемого значения оно обычно используется для обозначения отсутствия совпадений.
Эта константа определяется со значением -1, которое, поскольку size_t является целочисленным типом без знака, это наибольшее возможное представимое значение для этого типа.
Источник
Что означает string:: npos
что делает заявление string::npos означает здесь
9 ответов
это означает, что не найдено.
обычно он определяется следующим образом:
лучше сравнивать с НКО, а не -1, потому что код более читаемым.
string::npos константа (наверное -1 ), представляющая не-позиции. Он возвращается методом find когда шаблон не был найден.
НКО — это статическое постоянное значение члена с максимально возможным значением для элемента типа size_t.
в качестве возвращаемого значения обычно используется для обозначения сбоя.
эта константа фактически определяется значением -1 (для любого признака), которое, поскольку size_t является беззнаковым интегральным типом, становится максимально возможным представимым значением для этого типа.
size_t является беззнаковой переменной, поэтому «unsigned value = — 1» автоматически делает его максимально возможным значением для size_t : 18446744073709551615
std::string::npos — Это определенный индекс реализации, который всегда выходит за рамки любого std::string экземпляра. Различные std::string функции возвращают его или принимают его для сигнала за пределами конца Строковой ситуации. Обычно он имеет некоторый целочисленный тип без знака, и его значение обычно std::numeric_limits ::max () который (благодаря стандартным целочисленным акциям) обычно сопоставим с -1 .
found будет npos в случае невозможности найти подстроку в строке поиска.
мы должны использовать string::size_type для возвращаемого типа функции find в противном случае сравнение с string::npos может не работать. size_type , который определяется распределителем строки, должен быть unsigned целочисленный тип. Распределитель по умолчанию, распределитель, использует тип size_t as size_type . Потому что -1 is преобразованные в беззнаковый интегральный тип, НКО-это максимальное беззнаковое значение его типа. Однако, точное значение зависит от точного определения типа size_type . К сожалению, эти максимальный значения различаются. На самом деле, (unsigned long)-1 отличается от (unsigned short)- 1 если размер типы различаются. Таким образом, сравнение
может дать false, если idx имеет значение -1 и idx и string::npos имеют различные типы:
один из способов избежать этой ошибки-проверить, не происходит ли поиск напрямую:
однако часто вам нужен индекс соответствующей позиции символа. Таким образом, еще одно простое решение это определить свой собственный подписанное значение для НКО:
теперь сравнение выглядит немного по-другому и даже удобнее:
он возвращается строковыми функциями, указывающими на ошибку / не найден и т. д.
Источник