2 votes

Quelqu'un peut-il expliquer pourquoi cette opération d'effacement de vecteur ne fonctionne pas correctement ?

    vector<int> nums{1,2,3,0,0,0};

    for(int i = 0; i< nums.size(); i++){
        if(nums[i] == 0){
            nums.erase(nums.begin() + i);
        }
    }
    for(int i = 0; i< nums.size(); i++){
        cout << nums[i] << " ";
    }
    //I keep getting [1, 2, 3, 0]

Je veux enlever les zéros du vecteur pour qu'il ne reste que 1,2,3. Cependant, la méthode que j'utilise semble laisser un zéro à la fin. J'y travaille depuis un moment et j'ai joué avec l'indexation mais je n'arrive pas à le faire fonctionner correctement. J'apprécierais une aide, merci.

4voto

Kosta Points 1771

Chaque fois que vous effacez un vecteur, l'indice des éléments suivants diminue de 1. Vous devez en tenir compte :

for(int i = 0; i< nums.size(); i++){
        if(nums[i] == 0){
            nums.erase(nums.begin() + i);
            --i; // <-- HERE
        }
    }

Il s'agit d'un O(n^2) opération. Vous pouvez le faire dans O(n) comme ça :

nums.erase(std::remove(nums.begin(), nums.end(), 0),
           nums.end());

0voto

Kumar Arnav Points 63

En vector erase réduit la taille du vecteur. Le dernier zéro n'est pas effacé parce que vous effacez à partir du même vector dont la taille est vérifiée dans le for boucle.

0voto

user4581301 Points 18060

Effacer-Enlever a déjà été abordé, en voici un autre, mais inférieur, Réponse X-Y . Il mérite d'être mentionné car il montre comment utiliser erase La valeur de retour de l'utilisateur.

Utilisez des itérateurs.

vector<int> nums{1,2,3,0,0,0};

for(auto it = nums.begin(); it != nums.end(); ){
    if(*it == 0){
        it = nums.erase(it); // erase returns an iterator to the next element
                             // effectively it++ with the added benefit of it
                             // not being invalidated by removal from the vector
    }
    else {
        it++; // not removed? now we need to increment
    }
}
for(const auto & val: nums){
    cout << val << " ";
}

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