[英]Erasing an element of a vector that uses 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。 我一直在寻找错误的解决方案或变通办法,例如“擦除删除”习语,但是从我所看到的情况来看,当我需要按位置删除时,只能按值删除元素-简而言之,只是元素在第一位置! (我知道这对于矢量而言并不是很好的性能,但是我必须为此使用矢量)
编辑:为了澄清这种情况,该调用所包含的函数如下:
/// 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,问题就解决了。 感谢您指出正确的方向!
并不是说erase
仅适用于iterator
,它还适用于C ++ 11中的const_iterator
。 毕竟,要调用擦除,您需要对向量的可修改引用,并且如果有,您总是可以从const
那里获得一个普通的非常量iterator
。 这就是为什么他们更改成员以使用const_iterator
。
问题是,如果要调用的对象也是const
限定的(在本例中为vCars
begin()
则只能从begin()
返回const_iterator
。 反过来,这意味着您只能在其上调用const
限定函数,这是编译器尝试的操作:
... call to 'std::vector::erase(std::vector::const_iterator) const' ^^^^^
我认为您同意将const
erase
是没有道理的。 :)
错误信息:
没有匹配的函数来调用'std :: vector :: erase(std :: vector :: const_iterator)const'
暗示vCars.begin()
产生一个const_iterator
,这反过来意味着vCars
是一个常量对象或引用。 您不允许通过该参考来修改载体。 如果函数需要修改向量,则不能采用常量引用。
请注意,在声明为const
的成员函数中,隐式this
指针的类型为T const *
(即,您无法在const函数内部修改对象)。 如果是这种情况,则需要从函数中删除const
限定符。
看来您的参数“ vCars”是对向量的const引用。 您可以通过const_cast使其可变或更改功能设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.