簡體   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