7

2 つの異なるタイプのセットで std::set_intersection を実行する方法はありますか?

私は2つのセットを持っています:

std::set<X1> l_set1;
std::set<X2> l_set2;

X1 と X2 が等しいかどうかをチェックするコンパレータを定義できます。

struct sample_comparer
{
    bool operator()(const &X1 p_left, const &X2 p_right)
    {
        return p_left == p_right;
    }
};

ここで、これら 2 つのセットでセットの交差を試みます。

std::set<X1> l_intersect;
std::set_intersection(l_set1.begin(), l_set1.end(), l_set2.begin(), l_set2.end(),
                      std::inserter(l_intersect, l_intersect.begin()), sample_comparer());

残念ながら、このコードを機能させることはできません。これが可能かどうかさえわかりませんが、set_intersection の説明から、 2 つの異なる反復子を使用できることがわかります。

目的のコード サンプルを検索しようとしましたが、見つかりませんでした。誰かが私の問題の実際のコード サンプルを提示してくれませんか?

更新: エラーは次のとおりです。

エラー: stl_function.h:227: '__x < __y' の 'operator<' に一致しません

前もって感謝します!

4

4 に答える 4

5

PlasmaHH によるコメントが問題である可能性があります。

set_intersection のような関数は、最初に次のように機能しますa < bb < a

その結果、ample_comparer は両方の方法を比較できる必要があります。

struct sample_comparer
{
    bool operator()(const &X1 p_left, const &X2 p_right)
    {
        return p_left == p_right;
    }
    bool operator()(const &X2 p_left, const &X1 p_right)
    {
        return p_left == p_right;
    }
};

以下は実際には意味のあることを何もしませんが、きれいにコンパイルされます:

struct A
{
  struct Compare { bool operator () (A const &, A const &) { return false;}  };
};

struct B
{
  struct Compare { bool operator () (B const &, B const &) { return false; } };
};

typedef std::set<A, A::Compare> S1;
typedef std::set<B, B::Compare> S2;

class IntersectionCompare
{
public:
  bool operator ()(S1::value_type, S2::value_type) { return false; } 
  bool operator ()(S2::value_type, S1::value_type) { return false; } 
};

void bar (S1 & s1, S2 & s2)
{
  S1 result;
  std::set_intersection (s1.begin ()
      , s1.end ()
      , s2.begin ()
      , s2.end ()
      , std :: insert_iterator< S1 > (result, result.end ())
      , IntersectionCompare ());
}
于 2011-08-24T12:05:42.520 に答える
4

両方の入力が出力反復子型に割り当て可能でなければならないため、機能しません。X1、X2 にいくつかの暗黙的な変換演算子を追加して、それらの間で変換を行い、それを機能させることができます。

于 2011-08-24T07:56:34.760 に答える
2

そのままでは不可能だと思います(少なくともユーザー定義の変換がなければ)。ドキュメントの「型に関する要件」セクションから:InputIterator1 and InputIterator2 have the same value type.

于 2011-08-24T09:08:07.290 に答える