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::find
gebruiken 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::remove
gebruiken om het te wissen element naar het einde van de vector te verplaatsen en vervolgens de functie erase
gebruiken. 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