2009-11-30 77 views
2

在這本書中「C++簡單地說」,就有了下面的示例代碼幫助我理解的std ::擦除

std::vector<int> data 
... 
std::erase(std::remove(data.begin(), data.end(), 42), 
    data.end()); 

我認爲,「刪除」是一個成員函數,這樣難道不應該是'data.erase'而不是'std :: erase'? 有沒有某種方式的C++編譯器可以告訴你想要什麼成員調用成員函數,或沒有書本省略擦除模板函數的任何文檔,或者是錯誤的例子?

回答

13

erase是一個成員函數。提供的示例不正確。

0

編輯:對不起他們是沒有通用擦除,只是雙重檢查

+0

有沒有通用的算法'erase'。 – 2009-11-30 19:10:13

+0

...甚至不在''中(請繼續嘗試)。 – 2009-11-30 19:11:04

+0

是的,我錯誤地說有一個通用的擦除算法(我記得錯了)。但標準庫中有一個算法頭。其中包括許多通用算法(查找,包含等),它與各種stl容器一起工作。 – lkristjansen 2009-11-30 19:15:06

7

沒有std::erasestd::map::erase,std::list::erase存在。但沒有std::erase存在。

this question關於幻影std :: erase。

+0

具體而言,所有的序列和關聯容器都提供成員'erase()'(它是它們的要求的一部分)以及'std :: basic_string'。 – 2009-11-30 19:13:16

3

是的,擦除是一個成員函數,所以它應該是data.erase()而不是std::erase()

3

你的觀察是正確的。 '擦除'應該是一個成員函數。只有容器上的成員函數才能更改該容器的內存大小。

0

有一個叫做std :: remove的算法。並在數據結構上調用擦除。 remove將所有要刪除的元素移動到迭代器範圍的末尾,並返回要刪除的第一個元素。如果找不到該元素,則返回end()。

那麼你就可以在std :: remove的返回值和數據結構的結尾開始調用erase。

請參見:http://www.sgi.com/tech/stl/remove.html

注意,刪除不會與訂購數據結構工作,因爲元素不能被重新安排。

刪除是線性的,所以會從一直到最後刪除一個向量。因爲它不需要在要移除的元素之後冒泡元素。

std::vector<int> data 
... 
data.erase(std::remove(data.begin(), data.end(), 42), data.end()) 

相比,這樣的事情是O(N ** 2)

std::vector<int> data 
... 
for (i = data.begin(), i != data.end(); ++i) { 
    if (*i == 42) data.erase(i) ; 
} 
+0

再次閱讀問題。它使用std :: remove。你不必說「看起來他們想要什麼」,因爲這就是他們用的。 – 2009-12-01 12:59:52