Set_intersection用于两种不同类型的集合
set_intersection for two different types of sets
是否有办法在两种不同类型的集合上执行std::set_intersection ?
我有两个集合:
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;
}
};
现在,我试着在这两个集合上做一个集合相交:
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的描述,我知道我可以使用两个不同的迭代器。
我试图搜索一些代码样本,做我想要的,但没有找到任何?有人能给我一个工作代码样本为我的问题?
更新:错误是:
error: stl_function.h:227:没有匹配'operator<' in '__x <__y '
提前感谢!
PlasmaHH的评论可能是问题所在。
像set_intersection这样的函数的工作方式是它们首先执行:a < b
,然后执行b < a
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 ());
}
这不起作用,因为两个输入都必须可赋值给输出迭代器类型。您可以为X1, X2添加一些隐式转换操作符,以便在它们之间进行转换以使其正常工作。
我不认为这是可能的,因为它是,(至少没有用户定义的转换)。文档中的"类型要求"部分:InputIterator1 and InputIterator2 have the same value type.
首先根据文档set_intersection使用的是运算符<第二,你可以创建第三个结构体它将从类型中提取用于比较的字段>
std::set<X1> l_set1;
std::set<X2> l_set2;
struct XCompare
{
int value;
XCompare(const X1& x)
{
value = x.value;
}
XCompare(const X2& x)
{
value = x.value;
}
}
std::set_intersection(...,...,[](const XCompare& c1, const XCompare& c2){
... } )
您可以沿着这条路径创建一个自定义包装器,它可以做任何事情,除非您的两种类型可以比较
template<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;
}
}
差不多。我没有测试它,它不会编译,但你明白了。也许类似的东西隐藏在STL库的某个地方
编辑:顺便说一句,我认为你可以使用某种变体类型(boost::variant或std::variant),我认为它已经这样做了…
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- C++中的集合(异构类型的数组)
- 整数到模板类型集合(C++)
- 将基元类型插入到集合中
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 使用模板C++任何集合类型的包装器
- 如何从C 中的集合中检索多个继承类型
- 我可以按类类型访问哪些类型的集合,并在必要时返回未找到
- CRTP 模式 但是在数据结构中存储非同构类型
- 创建一个抽象类类型的集合,shared_ptr的抽象类向量
- C++集合方法:函数'setCost'不可行:'this'参数的类型'const value_type'
- C - 如何将自己类型的值插入集合中
- Boost:当缺少类型时,如何通过基指针序列化/反序列化泛型类型集合
- 集合类型的可变长度参数列表
- 私有结构(在类中定义)不能用作属于同一类的函数的返回类型吗
- 有没有可能拥有C++模板函数,它接受任何类型T的集合
- 管理模板化派生类型的向量集合
- 以前这样做过吗?(Monad视图包装用于链操作的c++集合/类型)
- 循环访问类中的不同集合类型
- 为类型集合生成标识符