【问题标题】:How to declare STL Set with comparison Object of class with parametrized constructor如何使用带参数化构造函数的类的比较对象声明 STL Set
【发布时间】:2016-06-15 14:23:26
【问题描述】:

使用集合时,我想传递我自己的比较函数,该函数也接受一个参数。如何做到这一点以及如何将该集合作为引用传递给其他函数?

例如,我有一个比较器类(带有operator() 重载和私有默认构造函数),它在构造函数中接受一个参数,该参数在进行比较时使用。这适用于排序算法,如,

sort(myVector.begin(), myVector.end(), Comparator(10));

但是如何用这个带参数的比较器对象声明一个集合。

我已经尝试过这些语法,

std::set< MyObj, bool(*)(const MyObj&, const MyObj&)>   myObjSet(Compatrator(100));

现在当我插入 myObjSet.insert(MyObj(0)) 时,它会给出错误 Error: "left of '.insert' must have class/struct/union"

现在当我声明设置为时,

std::set< MyObj, Comparator(int)> myObjSet;

它给出了“函数返回函数”的错误。


class Comparator
{
    int m_cmpParameter;
    Comparator();

public:

    ~Comparator();
    Comparator(int pCmpParam):m_cmpParameter(pCmpParam){}

    bool operator()(const MyObj& pObjA, const MyObj& pObjB);
};

在我的项目中,我有一个类用于 STL 容器所需的所有比较。如何将此 Comparator 类与 Set 一起使用,并将参数传递给比较对象? 以及如何将此集合作为对其他函数的引用,更具体地说,函数签名应该是什么?

谢谢。

【问题讨论】:

    标签: c++ c++11 stl containers


    【解决方案1】:

    如果您需要比较器中的参数,则需要使用函数对象。与您的班级类似的东西。我认为您需要将函数调用运算符设为const 成员。你会像这样使用它:

    std::set<MyObj, Comparator> myObjSet(Comparator(100));
    

    【讨论】:

    • 具体来说,您必须构造要使用的比较对象并将其传递给集合构造函数。
    • 非常感谢库尔先生和克劳先生。会计。对我来说,这也是我在提出这个问题之前尝试过的明显解决方案,相信我,它给出了错误。在您回答之后,我确信今天早上我发现了其他一些问题。实际上,我的比较器构造函数的语法是 Comparator(CompareType pCmpType),其中 CompareType 是枚举。现在,当我将集合创建为 std::set myObjSet(Comparator(kCompareType_area));,并且在插入时,myObjSet.insert(123) 它给出错误,'.insert' 的左侧必须有类/结构/联合
    • 但是当我创建像 std::set myObjSet(Comparator((CompareType)kCompareType_area)) 这样的集合对象时,它编译得很好。现在我也很容易将我的集合作为参考传递,所以解决方案是在使用比较器对象清除集合的同时显式提供枚举的数据类型。感谢您的帮助:)
    • @BitKnight:您应该已经发布了完整的实际代码!你描述的问题是most vexing parse:当构造函数参数恰好是一个标识符时,意味着一个对象定义的语句也可以解释为一个函数声明,编译器更喜欢后者。当参数是您在问题中发布的整数文字时,情况并非如此!通常的解决方法是使用额外的括号,或者使用 C++11 或更高版本的花括号。
    • 嗯,这解释了很多。我不知道这个Most Vexing Parse 概念。非常感谢您在这方面启发我。我从来没有想过这可能是问题所在,这可能就是我发布问题最简单形式的原因。我一定会从下一次发布完整和实际的代码。再次感谢 Dietmar 先生,感谢您的帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2019-11-28
    • 2020-06-01
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多