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