2017-10-15 3 views
1

C++では、特定の条件を満たす要素のみを反復するイテレータを渡すことは可能ですか?私自身のイテレータクラスを書くことは確かに可能ですが、私は標準的なライブラリソリューションが存在するのだろうと思っています。例えば、std::discrete_distributionのコンストラクタは2つのイテレータ(beginとend)の入力を受け取ります。今、私は、次の手順を実行する必要があります:特定の条件を満たす要素のみを反復するイテレータを渡す

std::vector<int> x = {1, 2, 3, 4, 5}; 
std::vector<int> y; 
std::copy_if(x.begin(), x.end(), std::back_inserter(y), my_condition); 
std::discrete_distribution dd(y.begin(), y.end()); 

しかし、これは二回yのelemntsをコピーするために必要となります。

+0

'std :: vector :: iterator'から独自のイテレータクラスを派生させ、' operator ++ 'をオーバーライドして条件を使うことができます。こちらをご覧ください:https://stackoverflow.com/questions/25772860/c-iterator-over-certain-elements-in-vector – nitronoid

答えて

2

C++には、問題を解決する特別な構文も標準ライブラリ機能もありません。しかし、 "range-v3"と呼ばれるライブラリがあります。ここにいくつかのリンクがあります:
https://github.com/ericniebler/range-v3
https://ericniebler.github.io/range-v3/
view::remove_ifを探してください - これはあなたが必要と思うものです。これは、実際に何も変更せずに、その場でコンテナをフィルタリングします。

関連する問題