使用自己的比较器运算符()进行映射<>。在找不到 KEY 的情况下给出错误



我尝试实现自己的运算符,并在map<>中使用,代码如下:

#include <iostream>
#include <map>
#include <string>
using namespace std;
struct keyInfo
{
  string Key1; 
  string Key2; 
  /*bool keyInfo::operator()(keyInfo const& Left,keyInfo const& Right) const{
      return ((Left.Key1<Right.Key1)&&(Left.Key2<Right.Key2));
  }*/
};
struct LessComparer{
    bool operator()(keyInfo const& Left,keyInfo const& Right) const{
        return !(Left.Key1==Right.Key1 && Left.Key2==Right.Key2);
    }
};
struct valueInfo
{ 
  int value1; 
  int value2; 
  int value3; 
  valueInfo(const int A,const int B,const int C) : 
    value1(A),value2(B),value3(C) {}
};
typedef std::map<keyInfo, valueInfo, LessComparer> MapTYPE;
int main()
{
  MapTYPE TMap;
  keyInfo K;
  K.Key1="main";
  K.Key2="i";
  valueInfo V(-2,-3322,9000);
  TMap.insert(MapTYPE::value_type(K,V));
  MapTYPE::iterator It1=TMap.find(K);
  It1=TMap.find(K);
  if(It1!=TMap.end())
    std::cout<<"Success(K): "<<It1->second.value2<<std::endl;
  keyInfo E;
  E.Key1="main";
  E.Key2="j";
  //TMap.insert(std::pair<keyInfo,valueInfo>(E,V));
  MapTYPE::iterator It2=TMap.find(E);
  if (It2!=TMap.end())
     std::cout<<"Success(E): "<<(It2->second).value3<<std::endl;
  cin.get();
  return 0;
 }

这里我使用operator()返回0,前提是Left和Right的Key1和Key2都相等。我认为这是相同的路线图:较少的工作,我的意思是只有当满足相等条件时才返回false。

它在第一种情况下工作得很好,即找到相同密钥的TMap.fund(K)。但在第二种情况下,即TMap.fund(e)的呼叫过程中,它会弹出一个错误:

"Debug assertion failed"
Expression: Invalid operator <

比较运算符必须定义严格的弱排序。您可以通过词典学比较为可比较类型的化合物编写这样的比较:

define "(a1, b1) < (a2, b2)" if and only if
   (a1 < a2) OR (a1 == a2 AND b1 < b2)

这以显而易见的方式推广到任意元组CCD_ 1。

在C++中,这应该写如下:

return (Left.key1 < Right.key1) ||
       (!(Left.key1 > Right.key1) && (Left.key1 < Right.key1));

通过这种方式,您可以在任何类型的元组上定义字典排序,只使用每个组成类型的现有<-运算符。(注意,如果!(x < y) && !(y < x),则此排序考虑两个元素xy等效。)

最新更新