Как удалить диапазон элементов вектора, постоянно меняющих его размер (C++)?
У меня есть довольно интересная проблема (в любом случае, интересная для меня, будучи новичком и т. Д.): В C++ можно довольно легко вырастить вектор с помощью push_back(), который затем можно просто поместить в цикл, чтобы вырастить столько, сколько нужно. Проблема в том, что я не нашел подобной простой функциональности для уменьшения ее размера. Что я действительно хочу сделать, так это иметь вектор с заранее заданным размером, а затем, скажем, полностью удалить вторую половину (не только содержащиеся в нем элементы, но и размер вектора также должен быть уменьшен). Пример:
vector<int> numrange;
for (int i=0; i<=100; ++i) {numrange.push_back(i);}
Это отлично работает для выращивания вектора и заполнения его числами. Но это, похоже, недопустимо:
int vectsize=numrange.size();
for (int i=vectsize; i>=(vectsize/2); --i) {numrange.erase(i);}
Видите ли, я хочу стереть каждый элемент выше 50, но это не сработает. Что-то делать с "нет известного преобразования из int в const итератор"
Спасибо за помощь.
2 ответа
std::vector<>
"s erase()
функция-член принимает итератор типа std::vector<>::const_iterator
, Вы поставляете int
к функции, таким образом, вызов не может быть сделан как int
неявно преобразуется в std::vector<>::const_iterator
,
Вам нужно сместить итератор следующим образом:
numrange.erase(numrange.cbegin() + i);
Тем не менее, обратите внимание, что вы инициализируете i
в vectsize
который сам был инициализирован numrange.size()
, Это означает, что вы пытаетесь стереть один элемент после конца вашего диапазона. Вы должны использовать numrange.size() - 1
,
Кроме того, существуют перегрузки, которые стирают диапазон, к которому можно применить тот же принцип смещения:
numrange.erase(numrange.cbegin() + numrange.size() / 2, numrange.cend());
Метод erase
из std::vector
ожидает итератор вместо int
индекс в качестве аргумента.
Вы можете использовать begin-iterator и просто добавить количество пропускаемых элементов, чтобы достичь нужного итератора:
for (int i=vectsize; i>=(vectsize/2); --i) {numrange.erase(numrange.begin()+i);}