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 !

78
c++
demandé sur Grzegorz Krukowski 2013-02-27 01:32:51

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_));
142
répondu dasblinkenlight 2017-07-13 18:42:28

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);
}
81
répondu juanchopanza 2013-02-26 21:34:42