尝试在两个映射中插入时出现“__x < __y”操作符不匹配的错误。

8
在代码中有两个map。其中一个存储pair(一对值),另一个存储Values,Values是一个类,有5个变量,分别为string、int、string、int和int类型。但是,在尝试向第二个map插入时,我遇到了错误g++ error: no match for 'operator<' in '__x < __y'。(注意:第一个map中的Keys和Values会变成第二个map中的Values和Key)
如何解决这个问题?
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;
    }
}
3个回答

13

编译器不知道在映射中插入键的顺序,您需要为Values类定义一些有序关系。

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

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>>。因为你的Value类型没有bool operator<,所以less将无法编译。
因此,你可以定义一个适用于类的bool operator<,或者创建具有自己比较函数的映射。

2
Values类中实现bool operator<(const Values& other) const成员函数,使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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接