2013-10-09 91 views
3

我在學習C++ lambda函數,這個可能很容易的問題是給我一些問題。C++ lambda刪除偶數

我有一個向量中有一些整數。我試圖刪除所有的偶數。

我目前已經刪除了偶數,但是當我打印矢量的內容時,我剩下一些重複的數據仍然在矢量結束。

int main() 
{ 
    std::vector<int> v1 = {0,1,1,2,3,5,8,13,21,55,89}; 

    for (const auto &i : v1) std::cout<< i << " "; 
    std::cout<<std::endl; 

    v1.erase(std::remove_if(v1.begin(), v1.end(), [](int i) 
     { return (i % 2) == 0; })); 

    for (const auto &i : v1) std::cout<< i << " "; 
} 

OUTPUT:

0 1 1 2 3 5 8 13 21 55 89 
1 1 3 5 13 21 55 89 55 89 

我想二號線輸出爲:

1 1 3 5 13 21 55 89 

編輯

謝謝大家。我正在使用錯誤版本的擦除(現在感覺非常愚蠢)。下面是正確的代碼:

int main() 
{ 
    std::vector<int> v1 = {0,1,1,2,3,5,8,13,21,55,89}; 

    for (const auto &i : v1) std::cout<< i << " "; 
    std::cout<<std::endl; 

    v1.erase(std::remove_if(v1.begin(), v1.end(), [](int i) 
     { return (i % 2) == 0; }), v1.end()); 

    for (const auto &i : v1) std::cout<< i << " "; 
} 
+5

看看你正在調用哪個版本的'erase'。 – chris

回答

6

您使用的std::vector::erase,需要一個單一的迭代器過載。

這是希望的過載:

iterator erase(const_iterator first, const_iterator last); 

什麼你的目標是什麼是這樣的:

auto is_even = [](int i) { return (i % 2) == 0; }; 
v1.erase(std::remove_if(v1.begin(), v1.end(), is_even), v1.end()); 

此重載將清除firstlast之間的所有元素。

std::remove_if修改範圍以便它只包含不滿足由謂詞函數定義的條件的元素。然後它將一個迭代器返回到範圍的新結尾。

擦除通過實際刪除容器中的元素來完成作業。