1. ホーム
  2. c++

[解決済み] 2つのSTL集合の交差点はどのように見つけるのですか?

2022-11-08 14:53:12

質問

C++で2つのstd::setの間の交差点を見つけようとしていますが、ずっとエラーになっています。

私はこのために小さなサンプルテストを作成しました

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

int main() {
  set<int> s1;
  set<int> s2;

  s1.insert(1);
  s1.insert(2);
  s1.insert(3);
  s1.insert(4);

  s2.insert(1);
  s2.insert(6);
  s2.insert(3);
  s2.insert(0);

  set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end());
  return 0;
}

後者のプログラムは出力を生成しませんが、私は新しいセット(仮に s3 と呼ぶことにします)に次のような値が含まれることを期待します。

s3 = [ 1 , 3 ]

そのかわり、エラーが出ます。

test.cpp: In function ‘int main()’:
test.cpp:19: error: no matching function for call to ‘set_intersection(std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>)’

このエラーから私が理解したことは、このエラーは set_intersection に定義がなく、それを受け入れる Rb_tree_const_iterator<int> をパラメータとして受け取ります。

さらに、おそらく std::set.begin() メソッドはそのような型のオブジェクトを返します。

の交差点を見つける良い方法はありますか? std::set を見つける良い方法はありますか?できれば組み込み関数がいいのですが?

どのように解決するのですか?

の出力イテレータを用意していません。 set_intersection

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
                                  InputIterator2 first2, InputIterator2 last2,
                                  OutputIterator result );

のようにすることで修正します。

...;
set<int> intersect;
set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
                 std::inserter(intersect, intersect.begin()));

を必要とします。 std::insert のイテレータが必要です。このセットは今のところ空なので そのため std::back_inserter または std::front_inserter というように、setはこれらの操作をサポートしていません。