首页 > 解决方案 > 使用自定义比较器设置的 C++ STL

问题描述

对于 C++ STL set,我需要自定义比较,但我的代码存在严重问题。使用 Visual Studio 2019 编译失败。第一个错误是(在 xutility 中)“错误 C2672:'operator __surrogate_func':找不到匹配的重载函数”。

这是代码:

#include <set>

struct P
{
    char a;
    char b;
    char c;
};

class PSortingCriterion
{
public:
    bool operator() (const P &p1, const P &p2) const
    {
        if(p1.a != p2.a)
            return p1.a < p2.a;
        else if(p1.b != p2.b)
            return p1.b < p2.b;
        else if(p1.c != p2.c)
            return p1.c < p2.c;
        else
            return false; // p1 == p2
    }
};

std::set<P, PSortingCriterion> s1, s2, diff;

void F(void)
{
    if(s1 != s2) // errors are all due to this statement; no errors if it's removed
    {
    }
}

更新:按照 Igor Tandetnik 的建议,我修改了代码,但仍然无法编译(与上述相同的错误)。

新代码:

#include <set>
#include <algorithm>
#include <iterator>

struct P
{
    char a;
    char b;
    char c;
};

class PSortingCriterion
{
public:
    bool operator() (const P &p1, const P &p2) const
    {
        if(p1.a != p2.a)
            return p1.a < p2.a;
        else if(p1.b != p2.b)
            return p1.b < p2.b;
        else if(p1.c != p2.c)
            return p1.c < p2.c;
        else
            return false; // p1 == p2
    }
};

std::set<P, PSortingCriterion> s1, s2, diff;

void F(void)
{
    set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(diff, diff.begin()));
}


   

标签: stlsetcomparator

解决方案


要比较两个集合,您需要比较元素。请参阅Cpp参考。但是您没有提供任何方法来比较两个类型P的对象是否相等。

如果您添加:

bool operator== (const P& p1, const P& p2) {
   return p1.a == p2.a && p1.b == p2.b && p1.c == p2.c;
}

然后你的代码将编译。


推荐阅读