С++ Стереть векторный элемент по значению, а не по положению?

vector<int> myVector;

и скажем, что значения в векторе таковы (в этом порядке):

5 9 2 8 0 7

Если бы я хотел стереть элемент, содержащий значение "8", я бы сделал это:

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

Потому что это удалит 4-й элемент. Но есть ли способ стереть элемент, основанный на значении "8"? Как:

myVector.eraseElementWhoseValueIs(8);

Или просто нужно просто перебрать все векторные элементы и проверить их значения?

Ответ 2

Вы можете использовать std::find, чтобы получить итератор со значением:

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

Ответ 3

Вы не можете сделать это напрямую. Вам нужно использовать алгоритм std::remove для перемещения элемента, который нужно удалить до конца вектора, а затем использовать функцию erase. Что-то вроде: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());. Подробнее см. стирание элементов из вектора.

Ответ 4

Эрик Ниблер работает над предложением диапазона, а некоторые из примеров показывают, как удалить определенные элементы. Удаление 8. Создает ли новый вектор.

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

выходы

2
4
6
8
10
-----
2
4
6
10