2012-11-23 22 views
2

以除去我有一個小問題,lambda表達式而在std::vector遍歷的std ::載體不希望與的remove_if

使用remove_if我有一個下面的代碼段:

std::remove_if(openList.begin(), openList.end(), 
     [&](BoardNode& i){ 
      std::cout<< i.getCoordinates() << std::endl; 
      std::cout<< currentNode.getCoordinates() << std::endl; 
      return i.getCoordinates() == currentNode.getCoordinates(); } 
     ); 

這個沒有編譯器錯誤,但是從上面的語句返回true的元素不會從vector中移除;

我在屏幕上打印例如

[5,5] 
[5,5] 

openList保持原樣。

+3

您確定錯誤來自第一個代碼示例嗎? – juanchopanza

+2

「在調試過程中我沒有得到我的座標」是什麼意思?據我所知,第一個例子是正確的,第二個例子是錯誤的,因爲謂詞需要一個迭代器而不是'BoardNode'。 –

+1

此外,「不想返回正確類型」的標題是什麼意思?你的lambda正確返回'bool'。 –

回答

10

std::remove_if不從載體刪除任何東西,因爲它不能夠訪問它。相反,它會將要保留的元素移動到範圍的起始位置,將其餘元素保留在有效但未指定的狀態,並返回新的結束。

可以使用「擦除 - 刪除」成語實際上從載體清除它們:

openList.erase(
    std::remove_if( 
     openList.begin(), 
     openList.end(), 
     [&](BoardNode& i){return i.getCoordinates() == currentNode.getCoordinates();}), 
    openList.end()); 
+0

這就是我最終做的,謝謝! – Patryk

+0

對不起,我真的很難理解拉姆達的方括號裏面會發生什麼,你能向我解釋一下嗎? – Holly

3

我想你打算從刪除項目的載體。但是你做什麼,會不是真的刪除從矢量的項目,這讓你認爲lambda不起作用。您需要將erase()成員函數與std::remove結合使用。

換句話說,你必須使用erase-remove idiom爲:

v.erase(std::remove_if(v.begin(), v.end(), your-lambda-goes-here), v.end()); 
0

除去通過移動範圍中的元件以這樣的方式 的元素是做擦除被覆蓋。 舊和該範圍的新結束之間的元素具有未指定的值。返回到範圍的新結尾的迭代器 。 元素的相對順序保留。

http://en.cppreference.com/w/cpp/algorithm/remove

此外,檢查鏈路上的例子。