108

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::setC++で 2 つの交点を見つけるより良い方法はありますか? できれば組み込み関数?

4

5 に答える 5

129

の出力イテレータが提供されていません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セットは現在空であるため、イテレータが必要です。set はこれらの操作をサポートしていないため、std::back_inserterorは使用できません。std::front_inserter

于 2012-11-19T05:20:14.457 に答える
25

リンクのサンプルをご覧ください: http://en.cppreference.com/w/cpp/algorithm/set_intersection

交差点データを保存するには、別のコンテナが必要です。以下のコードは動作すると想定しています。

std::vector<int> common_data;
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(), std::back_inserter(common_data));
于 2012-11-19T05:21:50.313 に答える
7

std::set_intersectionを参照してください。結果を格納する出力イテレータを追加する必要があります。

#include <iterator>
std::vector<int> s3;
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(), std::back_inserter(s3));

完全なリストについては、 Ideoneを参照してください。

于 2012-11-19T05:22:38.070 に答える