2015-03-03 37 views
-1

要從向量中移除的元素,我們可以使用的std ::矢量> v.erase(&v[1]);沒有找到

v.erase(v.begin() + 1); // remove 2nd 

而且我發現一個句子在該網站(因此在某些職位如下)(如:this

v.erase(&v[1]); 

然而,當我嘗試使用第二個句子中,編譯器說「錯誤:呼叫到std ::向量)沒有匹配的功能...

http://ideone.com/UZJaEK

第二句只能在有限的環境中使用嗎?

+1

'erase()'需要一個迭代器。 'v.erase(&v[1]);''是無效的,除非vector的迭代器碰巧是一個指針,你在哪裏找到它的? – 2015-03-03 01:17:18

+1

實際的問題可能是:爲什麼指向元素的指針不會隱式地轉換爲迭代器到元素? – emlai 2015-03-03 01:19:17

+0

@ zenith捕捉這種誤用是足夠的理由,IMO。 – 2015-03-03 01:21:13

回答

5

erase()需要一個迭代,不是指針。

對於std::vector,碰巧指針是實現其迭代器的有效方式,所以第二種形式可以在使用指針作爲迭代器的實現中進行編譯。當然,這樣的用途完全不可移植。

現代實現通常對迭代器使用單獨的類型,在這種情況下,第二個版本不會編譯。使用單獨的類型允許在編譯時(例如,捕獲std::string的迭代器和std::vector<char>的偶然混淆)和運行時(用於調試模式)進行更好的錯誤檢查。

+0

FWIW,有很多代碼用Visual Studio 6.0編寫,使用指針代替迭代器。 – PaulMcKenzie 2015-03-03 01:35:17

+0

謝謝您的回覆。 – sevenOfNine 2015-03-03 02:04:49

0

cplusplus.comvector::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.

+3

cplusplus.com不是任何東西的「官方來源」 – 2015-03-03 01:23:17

+0

編輯修復@TC備註! – Telokis 2015-03-03 01:24:31

+0

感謝您的回覆。 – sevenOfNine 2015-03-03 02:05:05

相關問題