【问题标题】:Can't find mistake in using set_difference algorithm使用 set_difference 算法找不到错误
【发布时间】:2012-08-24 08:55:20
【问题描述】:

我明白了:

“object.h”

namespace objectNS
{
    class object
    {
    public:
        int m_number;
        bool operator== (const object& object) const;
        bool operator< (const object& object) const;
    };
    class compare
    {
    public:
        bool operator ()(const object*, const object*) const;
    };
}

“object.cpp”

#include "object.h"
typedef objectNS::object OBJECT;
bool OBJECT::operator== (const object &object) const
{
    return this->m_number == object.m_number;
}

bool OBJECT::operator< (const object &object) const
{
    return this->m_number < object.m_number;
}

bool objectNS::compare::operator() (const object* obj1, const object* obj2) const
{
    return obj1->m_number > obj2->m_number;
}

我有一些函数,它适用于对象,

void f(void)
{
    set<Compound_object*> detectedObjects;
    set<Compound_object*> deleteFromTrackedObjects;
    set_difference(detectedObjects.begin(), detectedObjects.end(), this->m_trackedObjects.begin(), this->m_trackedObjects.end(), inserter(addToTrackedObjects, addToTrackedObjects.end()));
}

问题描述: 我实现了operator&lt;operator==,两个实例的比较由m_number 执行,但是当集合detectedObjectstrackedObjects 包含具有相同m_number 的元素时, std::set_difference 返回 所有 元素,而不是预期的空结果集。

我什至尝试将函数对象 compare 作为模板参数赋给集合,但结果出现了很多关于 =!= 未正确定义的编译器错误。

不知道是什么问题?

【问题讨论】:

  • 请发布我们可以编译的代码(m_number vs m_numberOfObjectthis 在非成员函数中),但保持最小化(compare 的用途是什么?)。正确缩进。
  • 可能涉及到一些难以理解的 typedef,但从您的声明来看,您的集合似乎包含指向对象的 指针,而不是对象本身。在这种情况下,定义为对象类一部分的operator&lt; 将不会生效。
  • @jogojapan,是的,谢谢,听起来有道理,我没注意。所以我需要将适当的类定义为比较器并将其声明为 set 的参数?但是,在尝试将比较类作为参数提供给集合时,我得到那些“=”、“!=”没有定义的原因是什么?

标签: c++ stl operator-overloading set-difference stdset


【解决方案1】:

我看不出为什么要存储指向对象的指针而不是对象本身的充分理由。

要使用比较器,您需要确保为所有设置的实例提供相同的比较器类型set_difference: p>

set<Compound_object*, compare> m_trackedObjects;

set<Compound_object*, compare> detectedObjects;
set<Compound_object*, compare> deleteFromTrackedObjects;
set_difference(detectedObjects.begin(), detectedObjects.end(),
    this->m_trackedObjects.begin(), this->m_trackedObjects.end(),
    inserter(addToTrackedObjects, addToTrackedObjects.end()),
    compare());

【讨论】:

  • ecatmur,非常感谢您详细而巧妙的解释,现在代码编译并按预期工作!问题是:我将 comp 函数对象作为参数包含在集合中,但我忘记将它作为参数包含到算法 set_difference 中。再次感谢,祝您有美好的一天!
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 2019-01-16
相关资源
最近更新 更多