Comment obtenir la position d'un élément dans les chaînes vecteur, pour l'utiliser comme un index dans ints vecteur?
Je suis en train d'essayer d'obtenir l'index d'un élément dans un vecteur de strings
, afin de l'utiliser comme un index dans un autre vecteur de int
type, est-ce possible ?
Exemple:
vector <string> Names;
vector <int> Numbers;
...
// condition to check whether the name exists or not
if((find(Names.begin(), Names.end(), old_name_)) != Names.end())
{ // if yes
cout <<"Enter the new name."<< endl;
cin >> name;
replace(Names.begin(), Names.end(), old_name_, name);
}
Maintenant, je veux obtenir la position de old_name
dans le Names
vecteur, pour l'utiliser dans l'accès à certains élément de Numbers
vecteur. Pour que je puisse dire:
Numbers[position] = 3 ; // or whatever value assigned here.
J'ai essayé d'utiliser:
vector <string> :: const_iterator pos;
pos = (find(Names.begin(), Names.end(), old_name_))
Numbers[pos] = 3;
Mais évidemment cela ne fonctionne pas puisque pos
est de type string !
2 réponses
Pour obtenir une position d'un élément dans un vecteur connaissant un itérateur pointant vers l'élément, soustrayez simplement v.begin()
de l'itérateur:
ptrdiff_t pos = find(Names.begin(), Names.end(), old_name_) - Names.begin();
Maintenant, vous devez vérifier pos
contre Names.size()
pour voir si elle est en dehors des limites ou pas:
if(pos >= Names.size()) {
//old_name_ not found
}
Les itérateurs vectoriels se comportent de manière similaire aux pointeurs de tableau; la plupart de ce que vous savez sur l'arithmétique des pointeurs peut également être appliqué aux itérateurs vectoriels.
À Partir de C++11, vous pouvez utiliser std::distance
en lieu et place de la soustraction pour les deux itérateurs et pointeurs:
ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
Si vous voulez un indice, vous pouvez utiliser std::find
en combinaison avec std::distance
.
auto it = std::find(Names.begin(), Names.end(), old_name_);
if (it == Names.end())
{
// name not in vector
} else
{
auto index = std::distance(Names.begin(), it);
}