2012-02-23 8 views
0

C++のベクタから特定の要素を削除する標準的な方法は、削除/イレーズイディオムです。しかし、remove_ifに渡された述語は、検討中のベクトル要素を引数として取ります。述語が配列の他の要素に条件付きである場合、これを行うには良いSTL方法がありますか?削除条件が他の要素に依存するC++ベクタから要素を削除する

具体的な例を示すには、その直後にある数字の重複をすべて削除することを検討してください。ここで、n番目の要素を削除する条件は、n-1番目の要素に対して条件付きです。

は前に:11234555111333
後:1234513

+3

あなたの例では、**ユニーク**アルゴリズムの一例ですSTLでSTLアルゴリズムの全リストをチェックしてください。必要な答えが見つかるかもしれません。 – DumbCoder

答えて

2

このための標準的なアルゴリズムがあります。 std::uniqueは、それらの前に重複している要素を削除します(実際には、remove_ifのように、削除する要素が最後に集まるようにコンテナを再編成します)。簡単にするために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()); 
関連する問題