繁体   English   中英

删除使用const_iterator的向量的元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM