2016-04-19 9 views
2

非反復版、たとえば、 all_ofは次のように書くことができます:C++ copy_if、トランスフォームなどの機能版

template <class Container, class UnaryPredicate> 
bool all_of(Container s, UnaryPredicate f) { 
    return all_of(s.begin(), s.end(), f); 
} 

しかし、私はあなたがコンテナを返すアルゴリズムで同じことをすることはできないと思いますか?

template <class Container, class UnaryPredicate> 
Container copy_if(Container, UnaryPredicate); 

実装は限り中間結果を保持するためのベクターを使用するなどだが、ベクトルのテンプレートパラメータを指定する方法の欠如につまずいに私が得た最も近いです。私は行方不明のものがありますか?

+0

何おそらく必要です範囲ライブラリhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4128.html – Slava

+0

一時的な結果を保持するために 'ベクトル 'を使う理由は?コンテナの広告は直接? – Holt

+0

@Holt Containerを直接使用しようとしたとき、std :: setの場合は動作しませんでした。コンパイラはsetのイテレータが読取り専用であると思っていたようですが、それは意味をなさないものです。 – rwallace

答えて

4

あなたはあなたの温度を保持するためにvectorを使用する代わりにstd::insert_iteratorを使用する必要がありますoraryは:

template <class Container, class UnaryPredicate> 
Container copy_if(Container const& input, UnaryPredicate const& up) { 
    Container tmp; 
    std::copy_if(input.begin(), input.end(), 
       std::insert_iterator<Container>(tmp, tmp.begin()), up); 
    return tmp; 
} 

std::insert_iterator

Containerの要件が、両方 SequenceContainerAssociativeContainerの要件ではない insert()方法を、持っているあなたのコンテナを必要とする(表が完全ではありませんが、 [associative.reqmts]は、それを必要とする(表102)) 。


あなたが本当にベクトルを使用すると、すべてのContainer、あなたが使用して、その値型にアクセスすることができ、Container概念を尊重したい場合:

typename Container::value_type 

例:

std::vector<typename Container::value_type> 
1

私は最善の方法は、(Container cを想定)の種類を取ることだと思う:

*std::begin(c) 

いずれかdecltype経由:

using T = decltype(*std::begin(c)); 

またはオート経由:

auto elem = *std::begin(c); 
+0

_ "push_backを使用していますか?" "すべてのコンテナには' insert() 'が用意されています。 –

関連する問題