¿Qué significa la frase std::string::npos
en 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;
¿Qué significa la frase std::string::npos
en 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;
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.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
y obtengopos:4294967295 npos: 4294967295
cuando lo ejecuto en Windows, pero en Mac obtengopos:4294967295 npos: 18446744073709551615
. Eso no parece correcto ... bueno, de cualquier manera, sugiero comparar con en-1
lugar destd::string::npos
string::npos
es una constante (probablemente-1
) que representa una no posición. Se devuelve por métodofind
cuando no se encontró el patrón.fuente
El documento para
string::npos
dice:fuente
size_t
es una variable sin signo, por lo que 'valor sin signo = - 1' lo convierte automáticamente en el valor más grande posible parasize_t
: 18446744073709551615fuente
std::string::npos
es un índice definido por la implementación que siempre está fuera de los límites de cualquierstd::string
instancia. Variasstd::string
funciones 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 suelestd::numeric_limits<std::string::size_type>::max ()
ser comparable (gracias a las promociones de enteros estándar) a-1
.fuente
tenemos que usar
string::size_type
para el tipo de retorno de la función de búsqueda, de lo contrario, la comparación constring::npos
podría no funcionar.size_type
, que está definido por el asignador de la cadena, debe ser ununsigned
tipo integral. El asignador predeterminado, asignador, usa el tiposize_t
comosize_type
. Debido a que-1
se 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 tiposize_type
. Desafortunadamente, estos valores máximos difieren. De hecho,(unsigned long)-1
difiere de(unsigned short)-
1 si el tamaño de los tipos es diferente. Por tanto, la comparaciónpodría producir falso si idx tiene el valor
-1
y idx ystring::npos
tienen diferentes tipos:Una forma de evitar este error es comprobar si la búsqueda falla directamente:
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:
Ahora la comparación se ve un poco diferente e incluso más conveniente:
fuente
found
seránpos
en caso de no encontrar la subcadena en la cadena de búsqueda.fuente
Es devuelto por funciones de cadena que indican error / no encontrado, etc.
fuente
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,
fuente
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.
fuente
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 unstd::optional<std::string::size_type>
(que debería ser ...), entonces la condición se convierte en:fuente
El valor de string :: npos es 18446744073709551615. Es un valor devuelto si no se encuentra una cadena.
fuente
18446744073709551615
sería típico para 64 bitsstd::size_t
, es un valor máximo sin signo de 64 bits.