2016-10-17 8 views
0

copy_ifフィルタの使用方法インデックスの特定倍数をフィルタリングします。`copy_if`フィルタの` str`の複数のインデックスのフィルタリング方法

strが「1000020000300004000050000」の場合、newStrを「12345」にします。

によれば5 * 0、が5 * 1、ソースコード5 * 2など


であるである:

std::string str("1000020000300004000050000"); 
std::string newStr; 

std::copy_if(str.begin(), str.end(), 
    std::back_inserter(newStr), 
    [] (char c) { 
     // Some specific rule I want to return. 
     return ...; 
    } 
); 

理想的なコード:

std::copy_if(str.begin(), str.end(), 
    std::back_inserter(newStr), 
    [] (char c) { 
     // I can get the index of iteration. 
     return (index % 5 == 0); 
    } 
); 
+1

単純なforループで何が問題になっていますか? –

+0

私は知りたいことは 'copy_if'で同じことをすることができるかどうかです。ご意見ありがとうございます。 :) – Husky

答えて

1

あなたは、文字列の始まり渡すとラムダ関数のキャプチャとして現在のイテレータとそれに応じて使用することができます(ラムダはその後、変更可能である必要があります):

std::string str("1000020000300004000050000"); 
std::string newStr; 

std::copy_if(str.begin(), str.end(), 
std::back_inserter(newStr), 
[it = str.begin(), beg = str.begin()] (auto c) mutable { 
    // I can get the index of iteration. 
    return (std::distance(it++, beg) % 5 == 0); 
} 

DEMO

+1

これは面白い方法です。非RandomAccessIteratorの場合、 'std :: distance'は線形の複雑さを持つことに注意してください(この特定の場合は問題ありません)。一般的なラムダにはC++ 14が必要です –

0

あなたはローカル変数にインデックスを追跡することができます。参考としてiをキャプチャする必要があることに注意してください。すなわち[&i]

int i = 0; 
std::copy_if(str.begin(), str.end(), 
    std::back_inserter(newStr), 
    [&i] (char c) { 
     int index = i++; 
     return (index % 5 == 0); 
    } 
); 
関連する問題