C++ 自定义严格弱序

C++ 自定义严格弱序,c++,map,C++,Map,背景:我正在编写一个算法,该算法将对象映射存储到我想要累积的关联属性。这是一个级联分配过程,它使用通过网络的预定义路径将此属性加载到网络上。路径定义为从网络中的原点到网络中所有点的正向构建路径 问:为了实现这一点,我使用了一个带有自定义比较器的映射 bool pathLinkComp(const PathLink* lhs, const PathLink* rhs) { return (lhs != rhs) && (lhs->cost < rhs->

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

问:为了实现这一点,我使用了一个带有自定义比较器的映射

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

问题是,如果我使用严格的弱排序,那么我最终会遇到这样的情况:如果两个PathLink对象具有完全相同的成本,那么它们实际上会成为相同的对象,用于索引目的。如果您可以使用指针的值(似乎您的贴图类型是map,对吗?)来区分成本相等的项目,而不是:

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));
}
bool-pathLinkComp(常量路径链接*lhs,常量路径链接*rhs){
返回(左侧->成本<右侧->成本)
或者(lhs->cost==rhs->cost和std::less()(lhs,rhs));
}

听起来您需要一个允许非唯一键的
std::multimap


顺便说一句,我认为没有必要在比较器中使用
(lhs!=rhs)
表达式。

这里的语言分解。。。“如果我使用这个应该(至少)是
(lhs->costcost)| |((lhs->cost==rhs->cost)和&std::less()(lhs,rhs))
。你没有写
|
&
的任何特殊原因!这很完美,它明确地显示了我试图进行的比较……我很确定它在功能上与我原来的函数是等价的。”[lhs->cost>=rhs->cost&&lhs!=rhs]但顺序相反。区别在于它显示了大量的订购关系better@OliCharlesworth:从1998年之前开始;请参见标准中的§2.5p2和§2.12p1。我认为您关于多余(lhs!=rhs)的看法是正确的…我认为这是我从>>修改比较器时留下的(因为我首先需要最昂贵的链接-现在我使用end()-1,以前我使用begin())
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));
}