Стирание элемента вектора, который использует const_iterator

У меня есть вектор объектов Car, объявленный как

vector<Car> vCars

В одной из моих функций мне нужно стереть первый элемент вектора. Звучит достаточно просто, верно? Строка, которая выдает ошибку:

vCars.erase( vCars.begin() );

И ошибка:

no matching function for call to 'std::vector<Car>::erase(std::vector<Car>::const_iterator) const'

Я понимаю, что стирание обычно принимает только итератор для своего параметра, а не const_iterator. Я искал решения или обходные пути для ошибки, такие как идиома erase-remove, но из того, что я вижу, он удаляет элемент только по значению, когда мне нужно удалить по позиции — и достаточно просто, просто элемент на первой позиции! (Я знаю, что это не очень хорошая производительность для вектора, но я должен использовать вектор для этого)

редактировать: чтобы прояснить ситуацию, функция, в которой содержится вызов, находится ниже:

    /// Removes the Car at the front of the garage without returning the instance.
void Garage::pop() const {
if ( !empty() ) {
vCars.erase( vCars.begin() );
}
}

Редактировать: И теперь я вижу, где я ошибся. Было много методов, которые были const, и я просто бездумно сделал pop () методом const! Как только я удалил const, проблема была решена. Спасибо, что указал мне правильное направление!

2

Решение

Сообщение об ошибке:

нет соответствующей функции для вызова ‘std :: vector :: erase (std :: vector :: const_iterator) const’

подразумевает, что vCars.begin() дает const_iteratorчто, в свою очередь, означает, что vCars постоянный объект или ссылка. Вы не можете изменять вектор с помощью этой ссылки. Если функции необходимо изменить вектор, она не может принимать постоянную ссылку.

Обратите внимание, что в функции-члене, объявленной как const неявный this указатель имеет тип T const * (то есть вы не можете изменить объект внутри константной функции). Если это ваш случай, вам нужно будет const классификатор из функции.

1

Другие решения

Это не то erase работает только для iteratorс, это также работает для const_iterators в C ++ 11. в конце концов, чтобы вызвать стирание, вам нужна модифицируемая ссылка на вектор, и если у вас есть это, вы всегда можете получить обычный неконстантный iterator из const один. Это обоснование того, почему они изменили члена, чтобы принять const_iterator,

Проблема в том, что вы получаете только const_iterator обратно из begin() если объект, на который вы его вызываете, тоже const квалифицированный — в этом случае ваш vCars, Это, в свою очередь, означает, что вы можете только позвонить const квалифицированные функции на нем, что пытается компилятор:

... вызов 'std :: vector :: erase (std :: vector :: const_iterator) const'
^^^^^

Я думаю, что вы согласны с тем, что erase являющийся const квалифицированный не имеет смысла. 🙂

4

Кажется, ваш параметр «vCars» является константной ссылкой на вектор. Вы можете сделать его изменяемым через const_cast или изменить дизайн вашей функции.

0
По вопросам рекламы [email protected]