STL multiset设置插入顺序C ++

时间:2016-04-05 20:23:49

标签: c++ stl multiset

我正在使用multiset来存储订购的对象集合,我使用的是运算符<建立订单标准,但我做错了,因为当我遍历multiset打印跟踪时,我可以看到它们根本没有订购....我真的被这个问题阻止了......

我尝试在这里简化我的代码:

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());
}

我宣布multiset的方式是:

std::multiset<CellSearch*> myOpenList;

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

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

这是功能:

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

我第一次使用multiset ...实际上是我的第一个不是矢量的容器:)你能在这里看到错误吗?

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

3 个答案:

答案 0 :(得分:4)

您的multiset正在将指针存储到对象中。因此,为了进行比较,它会比较指针,而不是对象本身。

要使其以当前形式运行,您需要将对象本身放入multiset。另一个选择是提供一个自定义比较器来设置,它会知道取消引用指针并比较实际对象 - 但在这种情况下这是次要的,因为我没有看到任何存储指针的理由。

最好将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

答案 1 :(得分:1)

问题是你没有处理CellSearch个对象的集合,而是指向它们的指针,这使得比较器可以使用指针。

以下是可以重复用于其他指针比较的通用解决方案:

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

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

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

答案 2 :(得分:0)

你可以像这样定义一个单元格较少的函子:

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

然后在声明multiset时使用它:

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