Que signifie string :: npos dans ce code?

91

Que signifie l'expression std::string::nposdans l'extrait de code suivant?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;
boom
la source

Réponses:

105

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.

Brian R. Bondy
la source
3
La comparaison de == -1 pourrait aussi faire penser à certaines personnes qu'elles peuvent convertir cela en <0, ce qui n'est PAS la même chose et ne fonctionnera pas.
Andy Dent
Je me demande simplement si quelqu'un a rencontré cela, ou est-ce juste moi ... Je cours cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;et pos:4294967295 npos: 4294967295je reçois quand je l'exécute sous Windows mais sur Mac je reçois pos:4294967295 npos: 18446744073709551615. Cela ne semble pas correct ... en tout cas je suggère de comparer au -1lieu destd::string::npos
user1135469
@ user1135469 si vous voyez la réponse de codaddict ci-dessous ( stackoverflow.com/a/3827997/752842 ) ou de Sebastian Raschka, je pense que ce que vous obtenez aura du sens. Et je recommanderais d'utiliser npos, car j'ai essayé d'utiliser -1 et cela ne fonctionnait pas correctement dans les conditions dans lesquelles je l'utilisais.
Dzyann
51

string::nposest une constante représentant (probablement -1) une non-position. Il est retourné par méthode findlorsque le modèle n'a pas été trouvé.

Sheldon L. Cooper
la source
15
+1 pour montrer réellement la dérivation npos = no-pos qui le rend facile à retenir. C'est tellement évident que vous n'y penseriez pas une fois que vous le saviez, mais pour quelqu'un qui voit ces lettres pour la première fois, il se peut qu'il ne clique pas ...?
Tony Delroy
4
faux sur 47 niveaux ... npos est de size_t, cela signifie qu'il ne peut pas être négatif ... le sens réel est max_index, 18446744073709551615 pour size_t 64 bits
NoSenseEtAl
25

Le document pour string::nposdit:

npos est une valeur de constante de membre statique avec la plus grande valeur possible pour un élément de type size_t.

En tant que valeur de retour, elle est généralement utilisée pour indiquer un échec.

Cette constante est en fait définie avec une valeur de -1 (pour tout trait), qui, étant donné que size_t est un type intégral non signé, devient la plus grande valeur représentable possible pour ce type.

codaddict
la source
17

size_test une variable non signée, donc 'unsigned value = - 1' en fait automatiquement la plus grande valeur possible pour size_t: 18446744073709551615


la source
size_t est un int non signé pour le compilateur 32 bits; unsigned long long int pour le compilateur 64 bits. Le définir à -1 lui donne la valeur maximale de ce type non signé.
sudheerbb
9

std::string::nposest un index défini par l'implémentation qui est toujours hors des limites de toute std::stringinstance. Diverses std::stringfonctions 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éralement std::numeric_limits<std::string::size_type>::max ()ce qui est (grâce aux promotions d'entiers standard) généralement comparable à -1.

Wilx
la source
4

nous devons utiliser string::size_typepour le type de retour de la fonction find, sinon la comparaison avec string::npospourrait ne pas fonctionner. size_type, qui est défini par l'allocateur de la chaîne, doit être de unsigned type intégral. L'allocateur par défaut, allocator, utilise le type size_tcomme size_type. Comme il -1est 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 type size_type. Malheureusement, ces valeurs maximales diffèrent. En fait, (unsigned long)-1diffère de (unsigned short)-1 si la taille des types diffère. Ainsi, la comparaison

idx == std::string::npos

peut donner false si idx a la valeur -1et idx et string::nposa des types différents:

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

Une façon d'éviter cette erreur est de vérifier si la recherche échoue directement:

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

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:

const int NPOS = -1;

Maintenant, la comparaison semble un peu différente et encore plus pratique:

if (idx == NPOS) { // works almost always
...
}
Débattre
la source
3

foundsera nposen cas d'échec de trouver la sous-chaîne dans la chaîne de recherche.

Raghuram
la source
1
$21.4 - "static const size_type npos = -1;"

Il est renvoyé par des fonctions de chaîne indiquant une erreur / introuvable, etc.

Chubsdad
la source
0

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,

  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");
asad_nitp
la source
Ce code ne passera pas pour "asad.other" car find () ne renvoie pas un int.
LogicMagic
0

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.

Leninkumar
la source
0

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 un std::optional<std::string::size_type>(ce qui devrait en quelque sorte ...) - alors la condition devient:

auto position = str.find(str2);

if ( position.has_value() ) {
    std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
einpoklum
la source
0

La valeur de string :: npos est 18446744073709551615. C'est une valeur renvoyée si aucune chaîne n'est trouvée.

Ayush ShaZz
la source
La valeur réelle est définie par l'implémentation et non pertinente. En pratique, cependant, la valeur 18446744073709551615serait typique pour 64 bits std::size_t, il s'agit d'une valeur non signée maximale de 64 bits.
Alex Guteniev le