Cosa significa string :: npos

Cosa significa l’istruzione string::npos qui

 found=str.find(str2); if (found!=string::npos) cout << "first 'needle' found at: " << int(found) << endl; 

Significa non trovato.

Di solito è definito in questo modo:

 static const size_t npos = -1; 

È meglio confrontare con npos anziché -1 perché il codice è più leggibile.

string::npos è una costante (probabilmente -1 ) che rappresenta una non posizione. Viene restituito dal metodo find quando il pattern non è stato trovato.

Il documento per string::npos dice:

npos è un valore costante membro statico con il massimo valore ansible per un elemento di tipo size_t.

Come valore di ritorno viene solitamente utilizzato per indicare il fallimento.

Questa costante è in realtà definita con un valore di -1 (per qualsiasi tratto), che poiché size_t è un tipo integrale senza segno, diventa il più grande valore rappresentabile ansible per questo tipo.

size_t è una variabile senza segno, quindi ‘valore non firmato = – 1’ lo rende automaticamente il più grande valore ansible per size_t : 18446744073709551615

std::string::npos è un indice definito dall’implementazione che è sempre fuori dai limiti di qualsiasi istanza di std::string . Varie funzioni std::string restituiscono o accettano il segnale oltre la fine della situazione di stringa. Solitamente è di un tipo intero senza segno e il suo valore è solitamente std::numeric_limits::max () che è (grazie alle promozioni di interi standard) in genere paragonabile a -1 .

found sarà npos in caso di errore nel trovare la sottostringa nella stringa di ricerca.

dobbiamo usare string::size_type per il tipo restituito della funzione find altrimenti il ​​confronto con string::npos potrebbe non funzionare. size_type , che è definito dall’allocatore della stringa, deve essere un tipo integrale unsigned . L’allocatore predefinito, allocator, utilizza type size_t come size_type . Poiché -1 viene convertito in un tipo integrale senza segno, npos è il valore massimo senza segno del suo tipo. Tuttavia, il valore esatto dipende dalla definizione esatta di tipo size_type . Sfortunatamente, questi valori massimi differiscono. Infatti, (unsigned long)-1 differisce da (unsigned short)- 1 se la dimensione dei tipi differisce. Quindi, il confronto

 idx == std::string::npos 

potrebbe restituire false se idx ha il valore -1 e idx e string::npos hanno diversi tipi:

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

Un modo per evitare questo errore è verificare se la ricerca non riesce direttamente:

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

Tuttavia, spesso è necessario l’indice della posizione del carattere corrispondente. Quindi, un’altra semplice soluzione è definire il proprio valore firmato per npos:

 const int NPOS = -1; 

Ora il confronto sembra un po ‘diverso e ancora più conveniente:

 if (idx == NPOS) { // works almost always ... } 
 $21.4 - "static const size_type npos = -1;" 

Viene restituito dalle funzioni stringa che indicano errore / non trovato ecc.

npos è solo un valore token che ti dice che find () non ha trovato nulla (probabilmente -1 o qualcosa del genere). find () verifica la prima occorrenza del parametro e restituisce l’indice a cui inizia il parametro. Per esempio,

  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");