J'essaie d'obtenir l'index d'un élément dans un vecteur de strings
, pour l'utiliser comme index dans un autre vecteur de type int
, 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 vecteur Names
, afin de l'utiliser pour accéder à certains éléments du vecteur Numbers
. 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 chaîne!
Pour obtenir la position d'un élément dans un vecteur connaissant un itérateur pointant sur l'élément, il suffit de soustraire v.begin()
de l'itérateur:
_ptrdiff_t pos = find(Names.begin(), Names.end(), old_name_) - Names.begin();
_
Maintenant, vous devez vérifier pos
par rapport à Names.size()
pour voir si elle est hors limites ou non:
_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 de pointeur peut également être appliqué aux itérateurs de vecteurs.
À partir de C++ 11, vous pouvez utiliser std::distance
à la place de la soustraction pour les itérateurs et les pointeurs:
_ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
_
Si vous voulez un index, 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);
}
_