Que signifie l'expression std::string::npos
dans l'extrait de code suivant?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Que signifie l'expression std::string::npos
dans l'extrait de code suivant?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Cela signifie introuvable.
Il est généralement défini comme suit:
static const size_t npos = -1;
Il vaut mieux comparer à npos au lieu de -1 car le code est plus lisible.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
etpos:4294967295 npos: 4294967295
je reçois quand je l'exécute sous Windows mais sur Mac je reçoispos:4294967295 npos: 18446744073709551615
. Cela ne semble pas correct ... en tout cas je suggère de comparer au-1
lieu destd::string::npos
string::npos
est une constante représentant (probablement-1
) une non-position. Il est retourné par méthodefind
lorsque le modèle n'a pas été trouvé.la source
Le document pour
string::npos
dit:la source
size_t
est une variable non signée, donc 'unsigned value = - 1' en fait automatiquement la plus grande valeur possible poursize_t
: 18446744073709551615la source
std::string::npos
est un index défini par l'implémentation qui est toujours hors des limites de toutestd::string
instance. Diversesstd::string
fonctions le renvoient ou l'acceptent pour signaler au-delà de la situation de fin de chaîne. Il est généralement d'un type entier non signé et sa valeur est généralementstd::numeric_limits<std::string::size_type>::max ()
ce qui est (grâce aux promotions d'entiers standard) généralement comparable à-1
.la source
nous devons utiliser
string::size_type
pour le type de retour de la fonction find, sinon la comparaison avecstring::npos
pourrait ne pas fonctionner.size_type
, qui est défini par l'allocateur de la chaîne, doit être deunsigned
type intégral. L'allocateur par défaut, allocator, utilise le typesize_t
commesize_type
. Comme il-1
est converti en un type intégral non signé, npos est la valeur non signée maximale de son type. Cependant, la valeur exacte dépend de la définition exacte du typesize_type
. Malheureusement, ces valeurs maximales diffèrent. En fait,(unsigned long)-1
diffère de(unsigned short)-
1 si la taille des types diffère. Ainsi, la comparaisonpeut donner false si idx a la valeur
-1
et idx etstring::npos
a des types différents:Une façon d'éviter cette erreur est de vérifier si la recherche échoue directement:
Cependant, vous avez souvent besoin de l'index de la position du caractère correspondant. Ainsi, une autre solution simple consiste à définir votre propre valeur signée pour npos:
Maintenant, la comparaison semble un peu différente et encore plus pratique:
la source
found
seranpos
en cas d'échec de trouver la sous-chaîne dans la chaîne de recherche.la source
Il est renvoyé par des fonctions de chaîne indiquant une erreur / introuvable, etc.
la source
npos est juste une valeur de jeton qui vous indique que find () n'a rien trouvé (probablement -1 ou quelque chose comme ça). find () vérifie la première occurrence du paramètre et renvoie l'index auquel le paramètre commence. Par exemple,
la source
statique const size_t npos = -1;
Valeur maximale de size_t
npos est une valeur de constante de membre statique avec la plus grande valeur possible pour un élément de type size_t.
Cette valeur, lorsqu'elle est utilisée comme valeur pour un paramètre len (ou sublen) dans les fonctions membres d'une chaîne, signifie «jusqu'à la fin de la chaîne».
En tant que valeur de retour, elle est généralement utilisée pour indiquer aucune correspondance.
Cette constante est définie avec une valeur de -1, ce qui étant donné que size_t est un type intégral non signé, il s'agit de la plus grande valeur représentable possible pour ce type.
la source
Une réponse pour ces jours de C ++ 17, quand on a
std::optional
:Si vous plissez un peu les yeux et que vous faites semblant de
std::string::find()
retourner unstd::optional<std::string::size_type>
(ce qui devrait en quelque sorte ...) - alors la condition devient:la source
La valeur de string :: npos est 18446744073709551615. C'est une valeur renvoyée si aucune chaîne n'est trouvée.
la source
18446744073709551615
serait typique pour 64 bitsstd::size_t
, il s'agit d'une valeur non signée maximale de 64 bits.