C++ Wis vectorelement op waarde in plaats van op positie?

en laten we zeggen dat de waarden in de vector dit zijn (in deze volgorde):

5 9 2 8 0 7

Als ik het element met de waarde “8” zou willen wissen, denk ik dat ik dit zou doen:

myVector.erase(myVector.begin()+4);

Omdat dat het 4e element zou wissen. Maar is er een manier om een element te wissen op basis van de waarde “8”? Vind ik leuk:

myVector.eraseElementWhoseValueIs(8);

Of moet ik gewoon alle vectorelementen doorlopen en hun waarden testen?


Antwoord 1, autoriteit 100%

Hoe zit het met std::remove()in plaats daarvan:

#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());

Deze combinatie staat ook bekend als het erase-remove idioom.


Antwoord 2, autoriteit 24%

U kunt std::findgebruiken om een iterator naar een waarde te krijgen:

#include <algorithm>
std::vector<int>::iterator position = std::find(myVector.begin(), myVector.end(), 8);
if (position != myVector.end()) // == myVector.end() means the element was not found
    myVector.erase(position);

Antwoord 3, autoriteit 3%

Je kunt dat niet rechtstreeks doen. U moet het algoritme std::removegebruiken om het te wissen element naar het einde van de vector te verplaatsen en vervolgens de functie erasegebruiken. Iets als: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());. Zie deze elementen wissen uit vectorvoor meer details.


Antwoord 4

Eric Niebler werkt aan een voorstel voor een assortiment en enkele van de voorbeeldenlaten zien hoe u bepaalde elementen kunt verwijderen. Verwijderen 8. Creëert een nieuwe vector.

#include <iostream>
#include <range/v3/all.hpp>
int main(int argc, char const *argv[])
{
    std::vector<int> vi{2,4,6,8,10};
    for (auto& i : vi) {
        std::cout << i << std::endl;
    }
    std::cout << "-----" << std::endl;
    std::vector<int> vim = vi | ranges::view::remove_if([](int i){return i == 8;});
    for (auto& i : vim) {
        std::cout << i << std::endl;
    }
    return 0;
}

uitgangen

2
4
6
8
10
—–
2
4
6
10

Other episodes