C++ c++;具有多个键比较的映射

C++ c++;具有多个键比较的映射,c++,iterator,binary-tree,binary-search-tree,C++,Iterator,Binary Tree,Binary Search Tree,我有一个名为mymap的成对键映射,我定义了一个名为cmplt_cmprsn的比较运算符,如下所示 #include <iostream> #include <map> struct prtl_cmprsn { bool operator()( const std::pair<int64_t, int64_t> &left, const std::pair<int64_t, int64_t> &right)

我有一个名为mymap的成对键映射,我定义了一个名为cmplt_cmprsn的比较运算符,如下所示

#include <iostream>
#include <map>

struct prtl_cmprsn {

  bool operator()(
    const std::pair<int64_t, int64_t> &left,
    const std::pair<int64_t, int64_t> &right) const
  {
    return left.first > right.first;
  }
};

struct cmplt_cmprsn {

  bool operator()(
    const std::pair<int64_t, int64_t> &left,
    const std::pair<int64_t, int64_t> &right) const
  {
    return left.first != right.first
      ? left.first > right.first
      : left.second > right.second;
  }
};

int main ()
{
  std::map<std::pair<int64_t, int64_t>, double, cmplt_cmprsn> mymap;
  return 0;
}
#包括
#包括
结构prtl\U cmprsn{
布尔运算符()(
常数标准::成对和左,
常量标准::成对(右)常量
{
返回left.first>right.first;
}
};
结构cmplt\U cmprsn{
布尔运算符()(
常数标准::成对和左,
常量标准::成对(右)常量
{
返回左。第一个!=右。第一个
?左.先>右.先
:left.second>right.second;
}
};
int main()
{
std::map mymap;
返回0;
}
它提供了mymap中使用的唯一配对键之间的完整比较

我想通过mymap执行两个单独的迭代:

(1) 在一次完整迭代中迭代所有唯一的成对键

(2) 查找所有唯一的第一个子键,并在两次嵌套迭代中迭代共享这些第一个子键的唯一成对键


我可以编写一个名为prtl_cmprsn的部分比较运算符,如上图所示。但是,mymap已经使用cmplt_cmprsn运算符定义。定义映射后是否有方法切换比较运算符,或者在此上下文中不可能有多个比较运算符?

模板
-huh?布尔运算符()的第一个和第二个公开代码只是语法错误。此外,
std::map
的谓词应接受两个参数
const std::pair&
——值的类型
double
。顺便说一句,如果所有的
if
s将代码IMHO-I缩短:。对于
prtl\u cmprsn
,a(接受重复的键)可能是更好的选择。如果你想要一个共享第一个键的范围,你可以使用{key1,-infinity}键调用
下限
,然后再使用{key+1,-infinity}前提是键不能等于+无穷大。但是,您也可以简单地找到范围的开始,然后在第一个键的值不再匹配时中断循环。@Scheff感谢您的澄清。我已经在我的OP中包含了你的代码。
模板
-嗯?第一个和第二个为
bool操作符()公开的代码
只是一个语法错误。此外,
std::map
的谓词应接受两个参数
const std::pair&
——值的类型
double
。顺便说一句,如果所有的
if
s将代码IMHO-I缩短:。对于
prtl\u cmprsn
,a(接受重复的键)可能是更好的选择。如果你想要一个共享第一个键的范围,你可以使用{key1,-infinity}键调用
下限
,然后再使用{key+1,-infinity}前提是键不能等于+无穷大。但是,您也可以简单地找到范围的开始,然后在第一个键的值不再匹配时中断循环。@Scheff感谢您的澄清。我已将您的代码包含在我的OP中。