2012-02-23 32 views
0

從C++向量中刪除某些元素的標準方式是刪除/刪除習慣用法。但是,傳遞給remove_if的謂詞僅將所考慮的向量元素作爲參數。如果謂詞是以數組的其他元素爲條件的,那麼是否有一種好的STL方法可以做到這一點?從刪除條件依賴於其他元素的C++向量中刪除元素

舉一個具體的例子,考慮刪除緊跟在其後面的數字的所有重複項。這裏去除第n個元素的條件取決於第(n-1)個元素。

前:11234555111333
後:1234513

+3

你的例子是的一個例子** **獨特算法在STL中。查看STL算法的整個列表,你可以找到你需要的答案。 – DumbCoder 2012-02-23 11:59:51

回答

2

有此一標準算法。 std::unique將刪除與它們重複的元素(實際上,就像它重新組織容器,以便將要刪除的元素聚集在其末尾)。上的std::string爲了簡化

實施例:

#include <string> 
#include <iostream> 
#include <algorithm> 

int main() 
{ 
    std::string str = "11234555111333"; 
    str.erase(std::unique(str.begin(), str.end()), str.end()); 
    std::cout << str; // 1234513 
} 
0

我認爲,將有更容易使用簡單的遍歷算法(經由)而不是使用std ::綁定。當然,使用std :: bind可以使用其他函數和謂詞(這取決於以前的元素)。但在你的例子中,你可以通過簡單的std :: unique來完成。

2

其他提到std::unique已經爲你的具體例子。 Boost.Range有adjacent_filtered adaptor,它通過兩個範圍的當前和下一單元的謂語是,由於謂語,適用於更大範圍的問題。但是Boost.Range也有uniqued adaptor

另一種可能性是簡單地保持一個參考範圍,這是很容易與C++ 11的λ做:

std::vector<T> v; 
v.erase(std::remove_if(v.begin(), v.end(), 
    [&](T const& x){ 
     // use v, with std::find for example 
    }), v.end());