從C++向量中刪除某些元素的標準方式是刪除/刪除習慣用法。但是,傳遞給remove_if
的謂詞僅將所考慮的向量元素作爲參數。如果謂詞是以數組的其他元素爲條件的,那麼是否有一種好的STL方法可以做到這一點?從刪除條件依賴於其他元素的C++向量中刪除元素
舉一個具體的例子,考慮刪除緊跟在其後面的數字的所有重複項。這裏去除第n個元素的條件取決於第(n-1)個元素。
前:11234555111333
後:1234513
從C++向量中刪除某些元素的標準方式是刪除/刪除習慣用法。但是,傳遞給remove_if
的謂詞僅將所考慮的向量元素作爲參數。如果謂詞是以數組的其他元素爲條件的,那麼是否有一種好的STL方法可以做到這一點?從刪除條件依賴於其他元素的C++向量中刪除元素
舉一個具體的例子,考慮刪除緊跟在其後面的數字的所有重複項。這裏去除第n個元素的條件取決於第(n-1)個元素。
前:11234555111333
後:1234513
有此一標準算法。 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
}
我認爲,將有更容易使用簡單的遍歷算法(經由)而不是使用std ::綁定。當然,使用std :: bind可以使用其他函數和謂詞(這取決於以前的元素)。但在你的例子中,你可以通過簡單的std :: unique來完成。
其他提到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());
你的例子是的一個例子** **獨特算法在STL中。查看STL算法的整個列表,你可以找到你需要的答案。 – DumbCoder 2012-02-23 11:59:51