我尝试实现自己的运算符并在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相等。我认为这与map::less的工作方式相同,我的意思是只有满足相等条件时它才返回false。在第一种情况下,即找到相同密钥的TMap.find(K),它可以正常工作。但是在第二种情况下调用期间,即TMap.find(E),它弹出一个错误,说:"Debug assertion failed"Expression: Invalid operator < 最佳答案 比较运算符必须定义严格弱排序。您通常可以通过词典比较法为可比较类型的化合物编写这样的比较:define "(a1, b1) < (a2, b2)" if and only if (a1 < a2) OR (a1 == a2 AND b1 < b2)这以明显的方式推广到任意元组(a1, b1, c1, ...)。在C++中,应这样编写:return (Left.key1 < Right.key1) || (!(Left.key1 > Right.key1) && (Left.key1 < Right.key1));这样,您可以为每个构成类型仅使用现有的< -operator对任何类型的元组定义字典顺序。 (请注意,如果使用x,则此顺序考虑的两个元素y和!(x < y) && !(y < x)等效)。关于c++ - 对 map <>使用自己的Comparator operator()。如果找不到KEY则给出错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9648100/
10-12 18:30