定制严格弱订货

时间:2011-02-06 22:31:30

标签: c++ map

背景:我正在编写一种算法,将对象的地图存储到我想要累积的关联属性中。这是一个级联分配过程,它使用通过网络的预定义路径将此属性加载到网络上。该路径被定义为从网络中的原点到网络中的所有点的构建转发路径。

问题:要实现这一点,我使用带有自定义比较器的地图

bool pathLinkComp(const PathLink* lhs, const PathLink* rhs) 
{
    return (lhs != rhs) && (lhs->cost < rhs->cost);
}

然后在我的级联方法中,我以下列方式使用它

PathLinkTripsMap myMap(pathLinkComp);
myMap[pathLinkOfInterest] = 100.0;
// populate other pathLinksOfInterest with initial values

while (myMap.size())
{
    // pop
    auto  firstIterator = myMap.end(); --firstIterator;
    PathLink* link  = firstIterator->first;
    double    trips = firstIterator->second;
    myMap.erase(firstIterator);

    // do something with the popped data

    // move the trips back onto the previous link (unless we are at the end of the path)
    PathLink* backLink = link->backLink;
    if (backLink) myMap[backLink] += trips;
}

这个问题在于,如果我使用严格的弱排序,那么我最终得到的情况是,如果两个PathLink对象具有完全相同的成本,那么它们实际上成为用于索引目的的相同对象。如果,而不是&lt;,我使用&lt; =我得到正确的行为,但这显然没有给出严格的弱排序,这是std :: map的比较器应该做的...这是一个大问题强迫std :: map以这种方式运作?

或者,我如何构建我的比较器以实现严格的弱和单独的键分开?

2 个答案:

答案 0 :(得分:2)

听起来你需要一个std::multimap,它允许使用非唯一键。

顺便说一句,我认为比较器中不需要(lhs != rhs)表达式。

答案 1 :(得分:1)

你可以使用指针的值(看起来你的地图类型是map&lt; PathLink const *,double&gt;,对吗?)来区分具有相同成本的项目:

bool pathLinkComp(const PathLink* lhs, const PathLink* rhs) {
  return (lhs->cost < rhs->cost)
    or (lhs->cost == rhs->cost and std::less<PathLink const*>()(lhs, rhs));
}