Что означает фраза std::string::npos
в следующем фрагменте кода?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Ответы:
Значит не найдено.
Обычно это определяется так:
static const size_t npos = -1;
Лучше сравнивать с npos вместо -1, потому что код более разборчивый.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
и получаю, pos:4294967295 npos: 4294967295
когда запускаю его в Windows, но на Mac я получаю pos:4294967295 npos: 18446744073709551615
. Это кажется неправильным ... в любом случае, я предлагаю сравнить -1
вместоstd::string::npos
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<std::string::size_type>::max ()
(благодаря стандартным целочисленным предложениям) обычно сопоставимо с -1
.
мы должны использовать string::size_type
тип возвращаемого значения функции поиска, иначе сравнение с string::npos
может не работать.
size_type
, который определяется распределителем строки, должен быть unsigned
целочисленным типом. Распределитель по умолчанию, распределитель, использует тип size_t
как size_type
. Поскольку -1
он преобразуется в целочисленный тип без знака, npos является максимальным беззнаковым значением его типа. Однако точное значение зависит от точного определения типа size_type
. К сожалению, эти максимальные значения различаются. Фактически, (unsigned long)-1
отличается от (unsigned short)-
1, если размер типов отличается. Таким образом, сравнение
idx == std::string::npos
может дать false, если idx имеет значение -1
и idx и string::npos
имеет разные типы:
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
Один из способов избежать этой ошибки - проверить, не завершился ли поиск напрямую:
if (s.find("hi") == std::string::npos) {
...
}
Однако часто вам нужен индекс соответствующей позиции символа. Таким образом, еще одно простое решение - определить собственное значение со знаком для npos:
const int NPOS = -1;
Теперь сравнение выглядит немного иначе и даже удобнее:
if (idx == NPOS) { // works almost always
...
}
Значение string :: npos - 18446744073709551615. Это значение возвращается, если строка не найдена.
18446744073709551615
будет типичным для 64-битного std::size_t
, это максимальное 64-битное беззнаковое значение.
npos - это просто значение токена, которое говорит вам, что find () ничего не нашел (возможно, -1 или что-то в этом роде). find () проверяет первое появление параметра и возвращает индекс, с которого начинается параметр. Например,
string name = "asad.txt";
int i = name.find(".txt");
//i holds the value 4 now, that's the index at which ".txt" starts
if (i==string::npos) //if ".txt" was NOT found - in this case it was, so this condition is false
name.append(".txt");
статическая константа size_t npos = -1;
Максимальное значение для size_t
npos - это статическое значение константы члена с максимально возможным значением для элемента типа size_t.
Это значение, когда оно используется как значение параметра len (или subblen) в строковых функциях-членах, означает «до конца строки».
В качестве возвращаемого значения оно обычно используется для обозначения отсутствия совпадений.
Эта константа определяется со значением -1, которое, поскольку size_t является целочисленным типом без знака, это наибольшее возможное представимое значение для этого типа.
Ответ для наших дней C ++ 17, когда у нас есть std::optional
:
Если вы немного прищурились и притворились, что std::string::find()
возвращает std::optional<std::string::size_type>
(что вроде как должно ...) - тогда условие становится:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}