std::map<struct,struct>::find 没有找到匹配项,但是如果我通过 begin() 循环到 end() 我会在那里看到匹配项

use*_*553 3 c++ string struct dictionary find

struct chainout {
    LONG cl;
    std::string cs;
    bool operator<(const chainout&o)const {
      return cl < o.cl || cs < o.cs;
    }
  } ;
  struct chainin{
    std::string tm;
    std::string tdi;
    short mss;
    LONG pinid;
    bool operator<(const chainin&o)const {
      return  mss < o.mss || pinid < o.pinid || tm<o.tm; //no tdi right now it's always empty
    }
  };
  std::map   <chainin,chainout> chainmap;
  std::map<chainin,chainout>::iterator it;
  chainin ci;
  chainout co;


 string FADEDevicePinInfo::getNetAtPinIdTmTidMss (const LONG p,const string tm, const string tid,const LONG mss){

  ci.tm=tm;
//  ci.tdi=tid;
  ci.tdi="";
  ci.mss=(short)mss;
  ci.pinid=p;
  for (it=chainmap.begin();it!=chainmap.end();it++){
    if(it->first.pinid==ci.pinid && it->first.tm==ci.tm&&it->first.mss==ci.mss && it->first.tdi==ci.tdi){
      cout << "BDEBUG: found p["; cout<<it->first.pinid; cout<<"] tm["; cout<<it->first.tm.c_str();cout<<"] mss[";cout<<it->first.mss;cout<<"] : ";cout<<it->second.chainSignal.c_str();cout<<endl;
    }
  }
  it=chainmap.find(ci);
  if(it == chainmap.end()){
    MSG(SEV_T,("no pin data found for pin[%ld]/tm[%s]/tdi[%s]/mss[%ld]",ci.pinid,ci.tm.c_str(),ci.tdi.c_str(),ci.mss));
  }
  return it->second.cs;
}
Run Code Online (Sandbox Code Playgroud)

这既打印了成功找到的行,又由于 map::find 未返回匹配项而引发 sev_t 错误。我做错了什么?

我通过 < 函数添加了打印语句,但它似乎对地图进行了正确排序,当我进行查找时,它似乎找到了正确的 mss/pinid,但随后只看到了一个 tm,这是错误的 tm。

Ken*_*rom 5

正如评论中所指出的,您有一个错误的比较运算符。如果您不知道对象应该按什么顺序排序,那么 std::map 或任何其他排序容器也不知道。

当您有多个要比较的东西时,请考虑决定哪个最重要,并使用 std::tie 来比较它们,如下所示:

#include <string>
#include <iostream>

struct chainout {
    int cl;
    std::string cs;
    bool operator<(const chainout&o)const {
        return std::tie(cl, cs) < std::tie(o.cl, o.cs);
    }
};

int main(){
    chainout a{ 1, "b" };
    chainout b{ 2, "a" };
    std::cout << (a < b) << std::endl;
    std::cout << (b < a) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)