gpt4 book ai didi

c++ - 无法将多个键添加到以结构为键的映射

转载 作者:太空宇宙 更新时间:2023-11-04 14:52:20 25 4
gpt4 key购买 nike

我正在尝试将多个键值对添加到 map having struct as both its key and value .由于某些原因,只有我添加的第一个键值对被添加到 map 中,而找不到第二个键值对。

#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;
}

}

以上代码输出如下:

Iterating through RJWebsocket::m_Nodes

port: 8766 IP: 172.16.129.68

最佳答案

你的比较运算符做了一些奇怪的事情,我建议依赖 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);
}

通过这种方式,检查 std::map::insert 中的等价性可以正确执行,并且您在 main 函数中的代码片段确实构造了两个条目。我机器上的输出是

Iterating through RJWebsocket::m_Nodes

port: 8768 IP: 172.16.128.130

Iterating through RJWebsocket::m_Nodes

port: 8766 IP: 172.16.129.68

请注意,正如@DanielLangr 在评论中指出的那样,RJNodeAddress也可以直接作为 std::pair<std::string, std::string> 的类型别名或 std::tuple<std::string, std::string> , 它提供了字典序 operator <开箱即用并返回到 std::string::operator < .这使您无需手动指定比较,但有两个缺点:它不提供命名 struct 的表现力。及其数据成员,以及它的字典顺序比较可能不是您最初想要的。

关于c++ - 无法将多个键添加到以结构为键的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52985806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com