Cosa significa la frase std::string::npos
nel seguente frammento di codice?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Risposte:
Significa non trovato.
Di solito è definito così:
static const size_t npos = -1;
È meglio confrontare con npos invece di -1 perché il codice è più leggibile.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
e ottengo pos:4294967295 npos: 4294967295
quando lo eseguo in Windows ma su Mac ottengo pos:4294967295 npos: 18446744073709551615
. Non sembra giusto ... beh in ogni caso suggerisco di confrontare con -1
invece distd::string::npos
string::npos
è una costante (probabilmente -1
) che rappresenta una non posizione. Viene restituito dal metodo find
quando il modello non è stato trovato.
Il documento per string::npos
dice:
npos è un valore costante del membro statico con il valore massimo possibile per un elemento di tipo size_t.
Come valore di ritorno viene solitamente utilizzato per indicare un errore.
Questa costante è effettivamente definita con un valore di -1 (per qualsiasi tratto), che poiché size_t è un tipo integrale senza segno, diventa il valore rappresentabile più grande possibile per questo tipo.
size_t
è una variabile senza segno, quindi "valore senza segno = - 1" la rende automaticamente il valore più grande possibile per size_t
: 18446744073709551615
std::string::npos
è un indice definito dall'implementazione che è sempre fuori dai limiti di qualsiasi std::string
istanza. Diverse std::string
funzioni lo restituiscono o lo accettano per segnalare oltre la fine della situazione di stringa. Di solito è di un tipo intero senza segno e il suo valore è std::numeric_limits<std::string::size_type>::max ()
solitamente paragonabile (grazie alle promozioni di numeri interi standard) a -1
.
dobbiamo usare string::size_type
per il tipo di ritorno della funzione find altrimenti il confronto con string::npos
potrebbe non funzionare.
size_type
, che è definito dall'allocatore della stringa, deve essere un unsigned
tipo integrale. L'allocatore predefinito, allocatore, utilizza il tipo 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 del tipo size_type
. Purtroppo, questi valori massimi differiscono. Infatti, è (unsigned long)-1
diverso da (unsigned short)-
1 se la dimensione dei tipi è diversa. Quindi, il confronto
idx == std::string::npos
potrebbe restituire false se idx ha il valore -1
e idx e string::npos
hanno tipi diversi:
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 è controllare se la ricerca fallisce 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 con segno per npos:
const int NPOS = -1;
Ora il confronto sembra un po 'diverso e ancora più conveniente:
if (idx == NPOS) { // works almost always
...
}
npos è solo un valore di 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 in corrispondenza del quale 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");
const statico size_t npos = -1;
Valore massimo per size_t
npos è un valore costante del membro statico con il valore massimo possibile per un elemento di tipo size_t.
Questo valore, se utilizzato come valore per un parametro len (o sublen) nelle funzioni membro della stringa, significa "fino alla fine della stringa".
Come valore di ritorno, viene solitamente utilizzato per indicare nessuna corrispondenza.
Questa costante è definita con un valore di -1, che poiché size_t è un tipo integrale senza segno, è il valore rappresentabile più grande possibile per questo tipo.
Una risposta per questi giorni di C ++ 17, quando abbiamo std::optional
:
Se strizzi un po 'gli occhi e fingi di std::string::find()
restituire un std::optional<std::string::size_type>
(cosa che in qualche modo dovrebbe ...), la condizione diventa:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
Il valore di string :: npos è 18446744073709551615. È un valore restituito se non viene trovata alcuna stringa.
18446744073709551615
sarebbe tipico per 64 bit std::size_t
, è un valore massimo senza segno a 64 bit.