🐱

【C++】ラムダ式を使い倒す:for_eachとany_ofを使用して2つのvector型変数から同じ値を探す

2021/07/29に公開約900字2件のコメント

vector型の変数a,bが共通して持っている値を総当り的に探してみました。any_ofはC++11以降対応のアルゴリズムです。

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

using namespace std;

int main() {
  vector< int > a = { 1, 2, 3, 4, 5 };
  vector< int > b = { 5, 6, 7, 8, 9 };
  vector< int > match_numbers;

  for_each( a.begin(), a.end(), [ &match_numbers, &b ] ( const int &a_element ){

    bool is_match = any_of( b.begin(), b.end(), [ &a_element ] ( const int &b_element ){
      return ( a_element == b_element );
    });

    if ( is_match ) {
      match_numbers.push_back(a_element);
    }
  });

  for_each( match_numbers.begin(), match_numbers.end(), [] ( const int &match_number ){  
    cout <<  match_number << endl;
  });
}
実行結果
5

for_eachaの全ての要素に対して処理を行います。そのためaの要素を1つずつa_elementに渡しています。

any_ofbの要素のいずれかが条件を満たしているかを調べます。bの要素b_elementの中にaの要素a_elementと一致する値が1つでもあればtrueを返します。

GitHubで編集を提案

Discussion

記事の趣旨と違いますが、 set_intersection を使ったほうが楽になりますね。

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

using namespace std;

int main() {
  set< int > a = { 1, 2, 3, 4, 5 };
  set< int > b = { 5, 6, 7, 8, 9 };
  set< int > match_numbers;
  set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(match_numbers, match_numbers.end()));

  for_each( match_numbers.begin(), match_numbers.end(), [] ( const int &match_number ){  
    cout <<  match_number << endl;
  });
}

コメントありがとうございます。知りませんでした!勉強になります。

ログインするとコメントできます