背景:我正在编写一种算法,将对象的地图存储到我想要累积的关联属性中。这是一个级联分配过程,它使用通过网络的预定义路径将此属性加载到网络上。该路径被定义为从网络中的原点到网络中的所有点的构建转发路径。
问题:要实现这一点,我使用带有自定义比较器的地图
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以这种方式运作?
或者,我如何构建我的比较器以实现严格的弱和单独的键分开?
答案 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));
}