C++中的代码:#include <iostream>#include <map>#include <string>using namespace std;struct keyInfo{ string Key1; string Key2; bool keyInfo::operator <(keyInfo &A) const { return ((this->Key1<A.Key1)&&(this->Key2<A.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> 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; }当我编译这段代码时,它给了我错误: 请让我知道我要去哪里错了?非常感谢您的帮助。谢谢。我尝试实现自己的运算符并在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 < (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您的operator<声明已关闭。struct keyInfo{ string Key1; string Key2; bool keyInfo::operator <(keyInfo &A) const { return ((this->Key1<A.Key1)&&(this->Key2<A.Key2)); }};...并且出于以下几个原因:在类中为声明加上类名是错误的。只有在类之外定义它时,才应该这样做。一些编译器是松懈的,但是标准说您不应该这样做。 无法编译的原因是operator<应该同时接受其操作数作为值(对于简单的事情)或const&。在这里,您忘记了const的A。 定义不正确,由于不遵守operator<的属性,因此antisymmetry的语义已关闭。 建议将二进制运算符声明为类之外的自由函数。 总而言之,正确的声明和定义是:struct keyInfo { std::string Key1; std::string Key2;};inline bool operator<(keyInfo const& left, keyInfo const& right) { if (left.Key1 < right.Key1) { return true; } if (left.Key1 > right.Key1) { return false; } return left.Key2 < right.Key2;}如果可以使用Boost,则实现此问题的一种“简单”方法是:inline bool operator<(keyInfo const& left, keyInfo const& right) { return boost::tie(boost::cref(left.Key1) , boost::cref(left.Key2)) < boost::tie(boost::cref(right.Key1), boost::cref(right.Key2));} (adsbygoogle = window.adsbygoogle || []).push({});
08-16 03:31