C++ 两种不同类型集合的集合\交点

C++ 两种不同类型集合的集合\交点,c++,stl,set-intersection,C++,Stl,Set Intersection,有没有办法在两种不同类型的集合上进行std::set_相交 我有两套: std::set<X1> l_set1; std::set<X2> l_set2; std::set<X1> l_intersect; std::set_intersection(l_set1.begin(), l_set1.end(), l_set2.begin(), l_set2.end(), std::inserter(l_interse

有没有办法在两种不同类型的集合上进行std::set_相交

我有两套:

std::set<X1> l_set1;
std::set<X2> l_set2;
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());
现在,我尝试在这两个集合上进行集合交集:

std::set<X1> l_set1;
std::set<X2> l_set2;
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());
std::设置l_相交;
std::set_交叉点(l_set1.begin()、l_set1.end()、l_set2.begin()、l_set2.end(),
std::inserter(l_intersect,l_intersect.begin()),sample_comparer();

不幸的是,我无法强制此代码工作。我甚至不确定这是否可能,但从集合_的交集我知道我可以使用两个不同的迭代器

我试图搜索一些符合我要求的代码示例,但没有找到任何?有人能为我的问题提供一个工作代码示例吗

更新: 错误是:


错误:stl_function.h:227:与“operator不匹配它将不起作用,因为两个输入都必须可分配给输出迭代器类型。您可以向X1和X2添加一些隐式转换运算符,它们在它们之间进行转换以使其工作。

我认为这是不可能的(至少在没有用户定义的转换的情况下)。
从中的“类型要求”部分可以看出:
InputIterator1和InputIterator2具有相同的值类型。

Plasmah的评论可能是问题所在

像集合交叉工作这样的功能首先执行:
a
,然后执行
b

因此,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 ());
}
结构A { 结构比较{bool运算符()(常数&,常数&){return false;}; }; 结构B { 结构比较{bool操作符()(B常量&,B常量&){return false;}; }; typedef std::set S1; typedef std::set S2; 类交叉比较 { 公众: bool运算符()(S1::value_-type,S2::value_-type){return false;} bool运算符()(S2::value_-type,S1::value_-type){return false;} }; 空心钢筋(S1和S1、S2和S2) { S1结果; 标准::设置交叉点(s1.begin() ,s1.end() ,s2.begin() ,s2.end() ,std::insert_迭代器(result,result.end()) ,IntersectionCompare()); }
首先,根据文档集,交集使用了一个运算符“很遗憾,我无法强制此代码工作”。您会遇到什么编译器错误?您的示例比较器没有做正确的事情。它必须是小于,对比较的元素施加严格的弱顺序。您是否尝试提供重载的bool运算符,您需要一个用于方向y x1template<typename T1, typename T2> struct ValueWrapper { T1 const* v1 = nullptr; T2 const* v2 = nullptr; ValueWrapper(const T1& value) { v1 = &value; } ValueWrapper(const T2& value) { v2 = &value; } bool operator<(const ValueWrapper& other) { if (v1 != nullptr) { if (other.v1 != nullptr) { return *v1 < *(other.v2) }
template<typename T1, typename T2>
struct ValueWrapperComparator
{
     bool operator()(ValueWrapper<T1,T2> v1, ValueWrapper<T1,T2> v2)
     {
         return v1 < v2;
     }
}