Ответ 1
Как насчет std::remove()
вместо:
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
Эта комбинация также известна как стирать-удалить идиому.
vector<int> myVector;
и скажем, что значения в векторе таковы (в этом порядке):
5 9 2 8 0 7
Если бы я хотел стереть элемент, содержащий значение "8", я бы сделал это:
myVector.erase(myVector.begin()+4);
Потому что это удалит 4-й элемент. Но есть ли способ стереть элемент, основанный на значении "8"? Как:
myVector.eraseElementWhoseValueIs(8);
Или просто нужно просто перебрать все векторные элементы и проверить их значения?
Как насчет std::remove()
вместо:
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
Эта комбинация также известна как стирать-удалить идиому.
Вы можете использовать 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);
Вы не можете сделать это напрямую. Вам нужно использовать алгоритм std::remove
для перемещения элемента, который нужно удалить до конца вектора, а затем использовать функцию erase
. Что-то вроде: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());
. Подробнее см. стирание элементов из вектора.
Эрик Ниблер работает над предложением диапазона, а некоторые из примеров показывают, как удалить определенные элементы. Удаление 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