要從向量中移除的元素,我們可以使用的std ::矢量> v.erase(&v[1]);沒有找到
v.erase(v.begin() + 1); // remove 2nd
而且我發現一個句子在該網站(因此在某些職位如下)(如:this)
v.erase(&v[1]);
然而,當我嘗試使用第二個句子中,編譯器說「錯誤:呼叫到std ::向量)沒有匹配的功能...
第二句只能在有限的環境中使用嗎?
要從向量中移除的元素,我們可以使用的std ::矢量> v.erase(&v[1]);沒有找到
v.erase(v.begin() + 1); // remove 2nd
而且我發現一個句子在該網站(因此在某些職位如下)(如:this)
v.erase(&v[1]);
然而,當我嘗試使用第二個句子中,編譯器說「錯誤:呼叫到std ::向量)沒有匹配的功能...
第二句只能在有限的環境中使用嗎?
erase()
需要一個迭代,不是指針。
對於std::vector
,碰巧指針是實現其迭代器的有效方式,所以第二種形式可以在使用指針作爲迭代器的實現中進行編譯。當然,這樣的用途完全不可移植。
現代實現通常對迭代器使用單獨的類型,在這種情況下,第二個版本不會編譯。使用單獨的類型允許在編譯時(例如,捕獲std::string
的迭代器和std::vector<char>
的偶然混淆)和運行時(用於調試模式)進行更好的錯誤檢查。
FWIW,有很多代碼用Visual Studio 6.0編寫,使用指針代替迭代器。 – PaulMcKenzie 2015-03-03 01:35:17
謝謝您的回覆。 – sevenOfNine 2015-03-03 02:04:49
從cplusplus.com,vector::erase
沒有這樣的過載。
也許,你正在尋找std::remove
來代替。
引用:
Transforms the range [first,last) into a range with all the elements that compare equal to val removed, and returns an iterator to the new end of that range.
cplusplus.com不是任何東西的「官方來源」 – 2015-03-03 01:23:17
編輯修復@TC備註! – Telokis 2015-03-03 01:24:31
感謝您的回覆。 – sevenOfNine 2015-03-03 02:05:05
'erase()'需要一個迭代器。 'v.erase(&v[1]);''是無效的,除非vector的迭代器碰巧是一個指針,你在哪裏找到它的? – 2015-03-03 01:17:18
實際的問題可能是:爲什麼指向元素的指針不會隱式地轉換爲迭代器到元素? – emlai 2015-03-03 01:19:17
@ zenith捕捉這種誤用是足夠的理由,IMO。 – 2015-03-03 01:21:13