擦除使用const_iterator的向量元素

时间:2012-09-30 15:55:05

标签: c++ vector iterator erase

我有一个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,问题就解决了。谢谢你指出我正确的方向!

3 个答案:

答案 0 :(得分:4)

erase不仅适用于iterator,它也适用于C ++ 11中的const_iterator。毕竟,要调用erase,你需要一个可修改的向量引用,如果你有,你总是可以从iterator得到一个正常的非const const。这就是他们为什么改变成员采取const_iterator背后的理由。

问题是,如果您调用的对象也是const_iterator合格的,那么您只能从begin()返回const - 在这种情况下,您的vCars }。反过来,这意味着您只能在其上调用const限定函数,这是编译器尝试的函数:

... call to 'std::vector::erase(std::vector::const_iterator) const'
                                                             ^^^^^

我认为您同意erase符合const条件是没有意义的。 :)

答案 1 :(得分:1)

错误消息:

  

没有用于调用'std :: vector :: erase(std :: vector :: const_iterator)const'的匹配函数

表示vCars.begin()产生const_iterator,这反过来暗示vCars是一个常量对象或引用。您不能通过该引用修改向量。如果函数需要修改向量,则不能进行常量引用。

请注意,在声明为const的成员函数中,隐式this指针的类型为T const *(即,您无法修改const函数内的对象)。如果是这种情况,则需要从函数中删除const限定符。

答案 2 :(得分:0)

似乎你的参数“vCars”是向量的const引用。您可以通过const_cast使其变为可变或更改您的功能设计。