¿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;
Respuestas:
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 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
string::nposes una constante (probablemente -1) que representa una no posición. Se devuelve por método findcuando no se encontró el patrón.
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.
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
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.
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
...
}
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");
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.
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;
}
El valor de string :: npos es 18446744073709551615. Es un valor devuelto si no se encuentra una cadena.
18446744073709551615sería típico para 64 bits std::size_t, es un valor máximo sin signo de 64 bits.