最近发布在Stack Overflow上的答案显示了代码,它为标准算法提供了一个采用不同类型操作数的比较器:
2.使用带模板的比较器
operator().而不是使用lambda,定义一个带模板的仿函数
operator().Run Code Online (Sandbox Code Playgroud)struct comparator { template<typename T, typename U> bool operator()(T const& lhs, U const& rhs) const { return lhs.mCommonField < rhs.mCommonField; } };然后,它就像:
Run Code Online (Sandbox Code Playgroud)std::sort(aStructs.begin(), aStructs.end(), comparator{}); std::sort(bStructs.begin(), bStructs.end(), comparator{}); // ... std::set_intersection(aStructs.begin(), aStructs.end(), bStructs.begin(), bStructs.end(), std::back_inserter(intersection), comparator{} );请注意,由于比较器中有模板,因此必须在函数范围之外声明.Coliru Viewer上的实例.
显然,这至少在实践中有效,正如工作现场演示所证明的那样.
但标准是否严格允许?
有没有办法在两种不同类型的集合上执行std :: set_intersection?
我有两套:
std::set<X1> l_set1;
std::set<X2> l_set2;
Run Code Online (Sandbox Code Playgroud)
我能够为它们定义一些比较器来检查X1和X2是否相等.
struct sample_comparer
{
bool operator()(const &X1 p_left, const &X2 p_right)
{
return p_left == p_right;
}
};
Run Code Online (Sandbox Code Playgroud)
现在,我尝试在这两组上进行集合交集:
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());
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法强制使用此代码.我甚至不确定这是否可行,但是从set_intersection 的描述我知道我可以使用两个不同的迭代器.
我试图搜索一些我想要的代码示例,但没有找到任何代码示例?有人可以向我提供我的问题的工作代码示例吗?
更新:错误是:
错误:stl_function.h:227:'__ x <__y'中的'operator <'不匹配
提前致谢!