繁体   English   中英

STL多集设置插入顺序C ++

[英]STL multiset setting insertion order C++

我正在使用多重集来存储有序对象的集合,我正在使用operator <来建立顺序标准,但是我做错了,因为当我遍历多重集打印跟踪时,我可以看到它们在以下位置不是有序的全部...。这个问题真的让我受阻...

我尝试在这里简化代码:

class CellSearch
{
    public:
        bool operator<(const CellSearch & C) const;
        int getF() const        { return _G + _H; }
    private:
        int _G;
        int _H;
}
...
bool CellSearch::operator< (const CellSearch& C) const
{
    return (this->getF() < C.getF());
}

我声明多重集的方式是:

std::multiset<CellSearch*> myOpenList;

然后我以这种方式插入一个新元素:

....
CellSearch *actualSearch = new CellSearch(start);
addOpenList(actualSearch, myOpenList);

这是函数:

void Grid::addOpenList(CellSearch* actual, std::multiset<CellSearch*>& openList)
{
    openList.insert(actual);
}

我是第一次使用多重集吗?实际上是我的第一个容器不是向量:)您在这里看到错误了吗?

我试图总结一下代码,希望不要太多...

您的多重集正在存储指向对象的指针 结果,为了进行比较,它比较的是指针 ,而不是对象本身。

为了使它以当前形式工作,您需要将对象本身放入多集。 另一个选择是提供一个自定义比较器进行设置,该比较器将知道要取消对指针的引用并比较实际的对象,但是在这种情况下这是次等的,因为我根本看不到任何存储指针的理由。

最好将operator <作为自由函数而不是类成员来实现。

如果您打算在容器中使用指针,则应该这样做:

template<class KEY>
struct pointer_compare {
    bool operator()(const KEY* lhs, const KEY* rhs) const {
        return *lhs < *rhs;
    }
}

std::multiset<Search*, pointer_compare<Search>> myOpenList

问题在于您不是在使用CellSearch对象集,而是在使用指向它们的指针,这使得比较器可以使用指针。

这是通用的解决方案,您可以将其重用于其他指针比较:

template<class T>
struct PointerComparator {
    bool operator()(const T *a, const T *b) const {
        return *a < *b;
    }
};

std::multiset<CellSearch*, PointerComparator<CellSearch> > myOpenList;

这样,您仍然可以为CellSearch定义operator <

您可以这样定义一个少单元函子:

class cmpCell
{
    bool operator()(CellSearch* a, CellSearch* b)
    {
        return *a < *b;
    }
};

然后在声明多集时使用它:

std::multiset<CellSearch*, cmpCell> myOpenList;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM