相关疑难解决方法(0)

标准算法比较器接受不同类型的对象是否合法?

最近发布在Stack Overflow上的答案显示了代码,它为标准算法提供了一个采用不同类型操作数的比较器:

2.使用带模板的比较器operator().

而不是使用lambda,定义一个带模板的仿函数operator().

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{}
                      );
Run Code Online (Sandbox Code Playgroud)

请注意,由于比较器中有模板,因此必须在函数范围之外声明.Coliru Viewer上的实例.

显然,这至少在实践中有效,正如工作现场演示所证明的那样.

但标准是否严格允许?

c++ c++11

7
推荐指数
1
解决办法
232
查看次数

set_intersection用于两种不同类型的集合

有没有办法在两种不同类型的集合上执行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 <'不匹配

提前致谢!

c++ stl set-intersection

6
推荐指数
1
解决办法
1825
查看次数

标签 统计

c++ ×2

c++11 ×1

set-intersection ×1

stl ×1