¿Qué significa string :: npos en este código?

91

¿Qué significa la frase std::string::nposen el siguiente fragmento de código?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;
auge
fuente

Respuestas:

105

Significa no encontrado.

Normalmente se define así:

static const size_t npos = -1;

Es mejor comparar con npos en lugar de -1 porque el código es más legible.

Brian R. Bondy
fuente
3
Comparar == -1 también podría hacer que algunas personas piensen que pueden convertir eso en <0, que NO es lo mismo y no funcionará.
Andy Dent
Me pregunto si alguien se ha encontrado con esto, o soy solo yo ... Corro cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;y obtengo pos:4294967295 npos: 4294967295cuando lo ejecuto en Windows, pero en Mac obtengo pos:4294967295 npos: 18446744073709551615. Eso no parece correcto ... bueno, de cualquier manera, sugiero comparar con en -1lugar destd::string::npos
user1135469
@ user1135469 si ve la respuesta de codaddict a continuación ( stackoverflow.com/a/3827997/752842 ) o de Sebastian Raschka, creo que lo que obtiene tendrá sentido. Y recomendaría usar npos, porque intenté usar -1 y no funcionaba correctamente en las condiciones en las que lo estaba usando.
Dzyann
50

string::nposes una constante (probablemente -1) que representa una no posición. Se devuelve por método findcuando no se encontró el patrón.

Sheldon L. Cooper
fuente
15
+1 para mostrar realmente la derivación npos = no-pos que hace que sea fácil de recordar. Es tan obvio que no lo pensarías una vez que lo supieras, pero para alguien que vea esas letras por primera vez, ¿puede que no haga clic ...?
Tony Delroy
4
incorrecto en 47 niveles ... npos es de size_t, significa que no puede ser negativo ... el significado real es max_index, 18446744073709551615 para 64 bits size_t
NoSenseEtAl
25

El documento para string::nposdice:

npos es un valor constante de miembro estático con el mayor valor posible para un elemento de tipo size_t.

Como valor de retorno, generalmente se usa para indicar falla.

Esta constante en realidad se define con un valor de -1 (para cualquier rasgo), que debido a que size_t es un tipo integral sin signo, se convierte en el valor representable más grande posible para este tipo.

codaddict
fuente
17

size_tes una variable sin signo, por lo que 'valor sin signo = - 1' lo convierte automáticamente en el valor más grande posible para size_t: 18446744073709551615


fuente
size_t no está firmado int para el compilador de 32 bits; unsigned long long int para el compilador de 64 bits. Establecerlo en -1 hace que tenga el valor máximo de ese tipo sin firmar.
sudheerbb
9

std::string::nposes un índice definido por la implementación que siempre está fuera de los límites de cualquier std::stringinstancia. Varias std::stringfunciones lo devuelven o lo aceptan para señalar más allá del final de la situación de la cadena. Suele ser de algún tipo de entero sin signo y su valor suele std::numeric_limits<std::string::size_type>::max ()ser comparable (gracias a las promociones de enteros estándar) a -1.

Wilx
fuente
4

tenemos que usar string::size_typepara el tipo de retorno de la función de búsqueda, de lo contrario, la comparación con string::npospodría no funcionar. size_type, que está definido por el asignador de la cadena, debe ser un unsigned tipo integral. El asignador predeterminado, asignador, usa el tipo size_tcomo size_type. Debido a que -1se convierte en un tipo integral sin signo, npos es el valor máximo sin signo de su tipo. Sin embargo, el valor exacto depende de la definición exacta de tipo size_type. Desafortunadamente, estos valores máximos difieren. De hecho, (unsigned long)-1difiere de (unsigned short)-1 si el tamaño de los tipos es diferente. Por tanto, la comparación

idx == std::string::npos

podría producir falso si idx tiene el valor -1y idx y string::npostienen diferentes tipos:

std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}

Una forma de evitar este error es comprobar si la búsqueda falla directamente:

if (s.find("hi") == std::string::npos) {
...
}

Sin embargo, a menudo necesita el índice de la posición del carácter coincidente. Por lo tanto, otra solución simple es definir su propio valor firmado para npos:

const int NPOS = -1;

Ahora la comparación se ve un poco diferente e incluso más conveniente:

if (idx == NPOS) { // works almost always
...
}
Debashish
fuente
3

foundserá nposen caso de no encontrar la subcadena en la cadena de búsqueda.

Raghuram
fuente
1
$21.4 - "static const size_type npos = -1;"

Es devuelto por funciones de cadena que indican error / no encontrado, etc.

Chubsdad
fuente
0

npos es solo un valor de token que le dice que find () no encontró nada (probablemente -1 o algo así). find () comprueba la primera aparición del parámetro y devuelve el índice en el que comienza el parámetro. Por ejemplo,

  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");
asad_nitp
fuente
Este código no es válido para "asad.other" porque find () no devuelve un int.
LogicMagic
0

estática const size_t npos = -1;

Valor máximo para size_t

npos es un valor constante de miembro estático con el mayor valor posible para un elemento de tipo size_t.

Este valor, cuando se usa como valor para un parámetro len (o subblen) en las funciones miembro de la cadena, significa "hasta el final de la cadena".

Como valor de retorno, generalmente se usa para indicar que no hay coincidencias.

Esta constante se define con un valor de -1, que debido a que size_t es un tipo integral sin signo, es el valor representable más grande posible para este tipo.

Leninkumar
fuente
0

Una respuesta para estos días de C ++ 17, cuando tenemos std::optional:

Si entrecierra los ojos un poco y finge que std::string::find()devuelve un std::optional<std::string::size_type>(que debería ser ...), entonces la condición se convierte en:

auto position = str.find(str2);

if ( position.has_value() ) {
    std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
einpoklum
fuente
0

El valor de string :: npos es 18446744073709551615. Es un valor devuelto si no se encuentra una cadena.

Ayush ShaZz
fuente
El valor real está definido por la implementación y es irrelevante. En la práctica, sin embargo, el valor 18446744073709551615sería típico para 64 bits std::size_t, es un valor máximo sin signo de 64 bits.
Alex Guteniev