2017-03-26 7 views
3

標準ライブラリには、2つの範囲の交差に含まれるオブジェクトを反復処理できるものがありますか?特に2つの範囲の交差点に含まれるオブジェクトを反復処理します。

、関数オブジェクトaction与えられ、Iはintersectionへの挿入の必要なし

/* some container supporting a push_back operation */ intersection; 
std::set_intersection(first1, last1, first2, last2, 
    std::back_inserter(intersection)); 
for (auto const& element : intersection) 
    action(element); 

に相当するプログラムを取得します。もちろん、このようなコードを記述するのは簡単です。たとえば、標準ライブラリにはすでに存在するものがあることを願っています。例えば、

template<class InputIt1, class InputIt2, class UnaryFunction> 
void for_each_in_intersection(InputIt1 first1, InputIt1 last1, 
    InputIt2 first2, InputIt2 last2, UnaryFunction f) 
{ 
    while (first1 != last1 && first2 != last2) 
    { 
     if (*first1 < *first2) 
      ++first1; 
     else 
     { 
      if (!(*first2 < *first1)) 
       f(*first1++); 
      ++first2; 
     } 
    } 
} 

などがあります。

+0

フル実施例であるあなただけ反復処理するためにポインタのコンテナをしたいですか? – wally

+2

Range-v3、Boost.Iterator、Boost.Rangeなどはすべてこの機能を持っていますが、stdlibに直接はありません。 – ildjarn

+0

@Muscampesterいいえ、[cppreference.com](http://en.cppreference.com/w/cpp/algorithm/set_intersection)の[std :: set_intersection'の可能な実装]を見てください。私は '* d_first ++ = * first1 ++; 'と同じコードを' action(* first1 ++); 'に置き換えて欲しいと思います。 – 0xbadf00d

答えて

6

あなたはブーストからFunction Output Iteratorを使用することができます。

#include <boost/function_output_iterator.hpp> 
#include <vector> 
#include <iostream> 
#include <algorithm> 

int main() { 
    std::vector<int> v1 = {1, 2, 3, 4, 5}; 
    std::vector<int> v2 = {2, 4}; 
    std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), 
      boost::make_function_output_iterator([](int i) { 
       std::cout << i * i << '\n'; 
      })); 
} 
+1

クールなもの!私は[最新のリンク](http://www.boost.org/doc/libs/release/libs/iterator/doc/function_output_iterator.html)を使うことを提案します。これは常に最新のブーストバージョンを指しています。 @ zett42ありがとう、 – zett42

+0

ありがとうございます。 – Grisha

1

私はあなたのコードよりも優れているようにしたいですか何ができるのSTLで何も知らないしません。

私が考えることができる単純ではstd::find()std::binary_search()、(おかげで、Rakete1111)とラムダ関数をstd::for_each()を必要とします。しかし、コンテナが注文されたという事実を使用しないので、私はそれは良い考えではないと思う。検索された値が注文される。

次は

#include <vector> 
#include <iostream> 
#include <algorithm> 

template <typename T> 
void action (T const & val) 
{ std::cout << "- action over " << val << std::endl; } 

int main() 
{ 
    std::vector<int> v1 { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; 
    std::vector<int> v2 { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 }; 

    std::for_each(v1.cbegin(), v1.cend(), 
       [&](int val) { 
     if (std::binary_search(v2.cbegin(), v2.cend(), val)) 
     action(val); 
    }); 
} 
+0

'std :: binary_search'(http://en.cppreference.com/w/cpp/algorithm/binary_search)を' std :: find'の代わりに使うことができます。これは、コンテナがソートされているので高速です。 – Rakete1111

+0

@ Rakete1111 - 私は 'std :: binary_search()'を考慮しませんでした。ありがとう。本当によかったです – max66

関連する問題