Как удалить диапазон элементов вектора, постоянно меняющих его размер (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);}
Другие вопросы по тегам