我正在使用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 ...实际上是我的第一个不是矢量的容器:)你能在这里看到错误吗?
我试着总结一下代码,希望不要太多......
答案 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;