Что означает фраза 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;
}