2014-03-07 13 views
4

在代码有两个map.One储存对等商店中的值是类与数据类型串5的变量, int,string,int,int.but在插入第二张图的过程中,出现错误g ++错误:试图在地图中插入时,'__x < __y'中'operator <'不匹配。 (注键和值在第一张地图的变化值,在第二张图键)错误:不对应的“运营商<”在“__X <__y”试图在两个地图插入当

如何解决它。

class Values 
{ 
private: 
    std::string C_addr; 
    int C_port; 
    std::string S_addr; 
    int S_port; 
    int C_ID; 

public: 
    Values(std::string,int,std::string,int,int); 
    void printValues(); 
}; 


Values :: Values(std::string Caddr,int Cport,std::string Saddr,int Sport,int Cid) 
{ 
    C_addr=Caddr; 
    C_port=Cport; 
    S_addr=Swaddr; 
    S_port=Sport; 
    C_ID=Cid; 
} 

void Values::printValues() 
{ 
    cout << C_addr<<":" <<C_port<<":" << S_addr <<":" <<S_port << ":"<<C_ID <<endl; 
} 


map<int, Values> items; 
map<Values,int> itemscopy; 

Values connection (inet_ntoa(Caddr.sin_addr),ntohs(Caddr.sin_port),inet_ntoa(Saddr.sin_addr),ntohs(Saddr.sin_port),CID); 


for(unsigned int key=0;key<=30000; ) 
{ 
    map<int,Values>::const_iterator itemsIterator=items.find(key); 

    if(itemsIterator==items.end()) 
    { 
     items.insert(pair<int, Values> (key, connection)); 
     { 
      map<Values,int>::const_iterator itemsIterator1; 
      if(itemsIterator1==itemscopy.end()) 
       itemscopy.insert(pair<Values,int> (connection, key)); 
     } 
    break; 
    } 
    else 
    { 
     cout<<"already exist"; 
     key=key+1; 
    } 
} 

回答

4

编译器不知道以何种顺序在地图中插入键。你必须为类的值定义一些顺序关系。

您需要定义操作<为你的类。例如,您可以按照以下方式或其他方式执行此操作

class Values 
{ 
private: 
    std::string C_addr; 
    int C_port; 
    std::string S_addr; 
    int S_port; 
    int C_ID; 

public: 
    Values(std::string,int,std::string,int,int); 
    void printValues(); 
    bool operator <(const Values &rhs) const 
    { 
     return (C_ID < rhs.C_ID); 
    } 
}; 
3

对于您的第二个映射,键类型不可比较。 map<Values,int>实质上是这个
map<Values, int, std::less<Values>, std::allocator<std::pair<const Values, int>。 Sinec你没有bool operator<你的值类型减少不会编译。

所以,你可以定义为类的bool operator<,或者你创建一个带有自己的比较功能的地图。

0

实施bool operator<(const Values& other) constValues类中的成员函数将使map<Values, int>可以对Values类型的键进行排序。地图存储键值对,键被排序,因此您需要为它们提供比较运算符。当您实例化map<Values, int>时,您表示您将使用Values作为键,ints作为该映射的值。

这里是一个小工作示例,其中,C_ID被作为所述比较的参数为Values

#include <map> 

class Values 
{ 
private: 
    std::string C_addr; 
    int C_port; 
    std::string S_addr; 
    int S_port; 
    int C_ID; 

public: 
    Values(std::string first,int second,std::string third,int fourth,int fifth) 
     : 
      C_addr(first), 
      C_port(second), 
      S_addr(third), 
      S_port(fourth), 
      C_ID(fifth) 
    {}; 

    bool operator<(const Values& other) const 
    { 
     return C_ID < other.C_ID; 
    } 
}; 

using namespace std; 

int main(int argc, const char *argv[]) 
{ 
    map<Values, int> mymap; 

    mymap.insert(std::make_pair(Values("test", 0, "me", 1, 2), 0)); 

    return 0; 
}