无法添加多个键以将struct作为键映射

Vis*_*rma 0 c++ std

我正在尝试将多个键值对添加到具有struct作为其键和值映射中.由于某些原因,只有我添加的第一个键值对被添加到地图中,并且找不到第二个键值对.

#include<string>
#include<iostream>
#include<map>
using namespace std;

struct RJNodeAddress
{
            string m_ip;
            string m_port;
            bool operator<(const RJNodeAddress &l)const
            {
                    int l_size=l.m_ip.size();
                    int r_size=l.m_port.size();                                          
                    return (l_size < r_size);
            }
};

struct RJNodeDetails
{
        string m_NodeType;
        int        m_appId;
};

class RJWebsocket
{
        public:
            static map<RJNodeAddress,RJNodeDetails> m_Nodes;
};

map<RJNodeAddress,RJNodeDetails> RJWebsocket::m_Nodes;

int main()
{
        RJNodeAddress l_node1,l_node2;
        RJNodeDetails l_add1,l_add2;

        l_node1.m_ip="172.16.129.68";
        l_node1.m_port="8766";
        l_node2.m_ip="172.16.128.130";
        l_node2.m_port="8768";

        l_add1.m_appId=0;
        l_add1.m_NodeType="CM";

        l_add1.m_appId=1;
        l_add1.m_NodeType="CM";

        RJWebsocket::m_Nodes.insert({l_node1,l_add1});
        RJWebsocket::m_Nodes.insert({l_node2,l_add2});

    for(const auto& j:RJWebsocket::m_Nodes)
    {
    cout<<endl<<"Iterating through RJWebsocket::m_Nodes"<<endl;
    cout<<endl<<"port: "<<j.first.m_port<<"  "<<"IP: "<<j.first.m_ip<<endl;
    }

}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了以下输出:

Iterating through RJWebsocket::m_Nodes

port: 8766  IP: 172.16.129.68
Run Code Online (Sandbox Code Playgroud)

lub*_*bgr 5

您的比较运算符做了一些奇怪的事情,我建议依赖于这样的提供者std::tuple:

#include <tuple>

bool operator<(const RJNodeAddress &l)const
{
    return std::tie(m_ip, m_port) < std::tie(l.m_ip, l.m_port);
}
Run Code Online (Sandbox Code Playgroud)

这样,std::map::insert可以正确执行等价检查,并且主函数内的代码段确实构造了两个条目.然后我机器上的输出是

Iterating through RJWebsocket::m_Nodes

port: 8768  IP: 172.16.128.130

Iterating through RJWebsocket::m_Nodes

port: 8766  IP: 172.16.129.68
Run Code Online (Sandbox Code Playgroud)

请注意,正如@DanielLangr在评论中指出的那样,RJNodeAddress也可以直接作为std::pair<std::string, std::string>or 的类型别名std::tuple<std::string, std::string>,它提供了operator <开箱即用的词典编辑并且可以回退std::string::operator <.这样可以避免手动指定比较,但有两个缺点:它没有提供命名struct及其数据成员的表现力,并且它的词典比较可能不是您想要的.