起初我是新来的,英语不是我的母语,所以为任何语法错误道歉,但我发现这个社区非常好,所以我会尽量问我的问题。

我想将我自己的类对象添加到 STL 容器多重集,并想用我自己的类中定义的重载 less 运算符对其进行排序。我真的尝试了几种解决方案,但没有任何效果,所以我希望有人能给我一些有用的提示来解决它。

这是我对类定义的一般想法:

class object {
public:
    int first;
    string second;

    object(int f, string s) {
         first = f;
         second = s;
    }

    bool operator<(const object &comp) {
        return first < comp.first;
        }
};

这是我的第一次尝试,但没有成功,所以我也尝试将重载运算符声明为友元方法,但它也不起作用。

这是我的主要功能的简短代码摘录:
includes ...
//code omitted
int main() {
    multiset<object*> mmset;

    mmset.insert(new object(10, "test"));
    mmset.insert(new object(11, "test"));

    return 0;
 }

一段时间后,我开始调试我的代码并试图找出问题所在,我遇到了以下让我有点怀疑的事情。

从 STL 中提取代码:
// TEMPLATE STRUCT less
template<class _Ty>
struct less : public binary_function<_Ty, _Ty, bool>
    {   // functor for operator<
    bool operator()(const _Ty& _Left, const _Ty& _Right) const
    {   // apply operator< to operands
          return (_Left < _Right);
    }
    };

我在这一行设置了一个断点并观察了程序在这里做什么,我不知道为什么,但它只比较两个对象的地址并返回所以总是假的。尽管运算符存在并且 _Left 和 _Right 变量包含我的对象的地址,但它从不调用我的重载 less 运算符。

如果有人可以帮助我,我将不胜感激。

最好的问候

汤姆

最佳答案

您没有在 object 中存储 multiset 。您正在存储 object* 。这些是指向 object 的指针。这意味着该集合将对您插入其中的指针进行排序。

看起来你真的只想要一个 multiset<object> :

multiset<object> mmset;
mmset.emplace(10, "test");
mmset.emplace(11, "test");

现在它将使用 < 来比较 object 本身。

如果你真的想存储指针,你需要为 multiset 提供一个自定义比较器。在 C++11 中,您可以使用 lambda 轻松完成此操作:
auto f = [](int* a, int* b) { return *a < *b; };
std::multiset<int*, decltype(f)> mmset(f);

在 C++11 之前,您可以创建一个实现 operator() 的函数对象,其主体与此 lambda 函数相同。

关于C++:在多集容器中使用自己的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16497414/

10-11 23:01
查看更多