109 votes

Comment obtenir la position d'un certain élément dans un vecteur de chaînes de caractères, pour l'utiliser comme un index dans un vecteur d'ints ?

J'essaie d'obtenir l'indice d'un élément dans un vecteur de strings pour l'utiliser comme un indice dans un autre vecteur de 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 Names pour l'utiliser lors de l'accès à un certain élément de la base de données de l'UE. 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 !

173voto

dasblinkenlight Points 264350

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 contre Names.size() pour voir si elle est hors limites ou non :

if(pos >= Names.size()) {
    //old_name_ not found
}

Les itérateurs de vecteurs se comportent de manière similaire aux pointeurs de tableaux ; la plupart de ce que vous savez sur l'arithmétique des pointeurs 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_));

99voto

juanchopanza Points 115680

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);
}

0voto

Hoen Points 1

Je suis presque sûr que l'arithmétique des pointeurs s'applique ici de la même manière que dans les tableaux.

int getVecPos(std::vector<string> vec, string element){
    int i;
    for(i = 0; i < vec.size(); i++){
        if(vec[i] == element){
            break;
        }
    }
    if(i == vec.size()){
        std::cout<<"No such element as "<<element<<" found. Please enter again: ";
        std::cin>>element;
        i = getVecPos(vec, element);
    }

    return i;
}

Vous pouvez l'ajouter à la fonction vec.begin() pour obtenir un itérateur que vous pouvez utiliser pour les autres fonctions vectorielles ou pour trouver l'indice d'un élément dans le tableau. Exemple:-

int getVecPos(std::vector<string>, string);//This was the function from earlier.
std::vector<string> UpdateHealables(std::vector<string> healables, string healing_item){
    auto it = healables.begin() + getVecPos(healables, healing_item);
    healables.erase(it);
    return healables;
}

-3voto

javer Points 1

Je suis un débutant, alors voici une réponse pour les débutants. Le if de la boucle for donne i, qui peut ensuite être utilisé comme Numbers[i] dans un autre vecteur. La plupart sont des exemples, le for/if dit vraiment tout.

int main(){
vector<string>names{"Sara", "Harold", "Frank", "Taylor", "Sasha", "Seymore"};
string req_name;
cout<<"Enter search name: "<<'\n';
cin>>req_name;
    for(int i=0; i<=names.size()-1; ++i) {
        if(names[i]==req_name){
            cout<<"The index number for "<<req_name<<" is "<<i<<'\n';
            return 0;
        }
        else if(names[i]!=req_name && i==names.size()-1) {
            cout<<"That name is not an element in this vector"<<'\n';
        } else {
            continue;
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X