c++ map/unordered_map多个键对应一个值

c++map需要使用多个键值如何编写 - 百度文库 (baidu.com)

map实现:

#include <iostream>
//#include <unordered_map>
#include <map>

std::map<std::pair<int,int>,std::string> m_IpVerNo;
int main()
{
    std::pair <int,int> test= std::make_pair(1,2);
    std::cout <<"test.first: "<< test.first <<"  ,test.second: "<< test.second <<"\n";
    m_IpVerNo[test]="only for test"; 
    std::map<std::pair<int,int>,std::string>::iterator iter=m_IpVerNo.find(test);
    if(iter==m_IpVerNo.end())
        std::cout <<"not find  "<<"\n";
    std::cout <<"test.second: "<< iter->second <<"\n";
  
    return 0;
}

执行结果:

root@debian:~/code# ./a.out
test.first: 1  ,test.second: 2
test.second: only for test

                                                                                                                                                           

unordered_map实现:

#include <iostream>
#include <unordered_map>
//#include <map>

struct pairhash {
public:
    template <typename T, typename U>
    std::size_t operator()(const std::pair<T, U> &x) const
    {
        return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
    }
};

std::unordered_map<std::pair<int,int>,std::string,pairhash> m_IpVerNo;
int main()
{
    std::pair <int,int> test= std::make_pair(1,2);
    std::cout <<"test.first: "<< test.first <<"  ,test.second: "<< test.second <<"\n";
    m_IpVerNo[test]="only for test"; 
    std::unordered_map<std::pair<int,int>,std::string,pairhash>::iterator iter=m_IpVerNo.find(test);
    if(iter==m_IpVerNo.end())
        std::cout <<"not find  "<<"\n";
    std::cout <<"test.second: "<< iter->second <<"\n";
  
    return 0;
}

执行结果:

root@debian:~/code# ./a.out 
test.first: 1  ,test.second: 2
test.second: only for test

struct结构多变量 unordered_map实现:

#include <string>
#include <iostream>
#include <unordered_map>
#include <functional>

typedef struct _ipport 
{
    unsigned int  dIp;                            //目的IP地址
    unsigned int  sIp;                            //源IP地址
    unsigned int  dPort;                          //目的端口
    unsigned int  sPort;                          //源端口
}IPPORT;


namespace std {
    template <> //function-template-specialization
        class hash<IPPORT>{
        public :
            size_t operator()(const IPPORT &stuIpPort ) const
            {
                return hash< unsigned int>()(stuIpPort.dIp) ^ hash< unsigned int>()(stuIpPort.sIp)^ hash< unsigned int>()(stuIpPort.dPort)^ hash< unsigned int>()(stuIpPort.sPort);
            }
    };
};

template<>
    struct std::equal_to<IPPORT>{//等比的模板定制
    public:
        bool operator()(const IPPORT &p1, const IPPORT &p2) const
        {
            return p1.dIp == p2.dIp && p1.sIp == p2.sIp && p1.dPort == p2.dPort && p1.sPort == p2.sPort;
        }
        
    };

std::unordered_map<IPPORT,std::string> m_IpVerNo;


int main()
{
	//将协议版本存入unordered_map
	IPPORT stuIpPort;
    stuIpPort.dIp=11;
    stuIpPort.sIp=11;
    stuIpPort.dPort=11;
    stuIpPort.sPort=11;
    m_IpVerNo[stuIpPort]="1000";

    stuIpPort.dIp=12;
    stuIpPort.sIp=11;
    stuIpPort.dPort=11;
    stuIpPort.sPort=11;
	
    m_IpVerNo[stuIpPort]="1100";

    stuIpPort.dIp=11;
    stuIpPort.sIp=11;
    stuIpPort.dPort=11;
    stuIpPort.sPort=11;
    m_IpVerNo[stuIpPort]="1200";
    
    m_IpVerNo.insert({stuIpPort, "1300"});
    m_IpVerNo.insert({stuIpPort, "1400"});

    stuIpPort.dIp=13;
    stuIpPort.sIp=11;
    stuIpPort.dPort=11;
    stuIpPort.sPort=11;
    m_IpVerNo.insert({stuIpPort, "1500"});




    #if 0
    //查找客户端协议版本号
    std::unordered_map<IPPORT,std::string>::iterator  iter=m_IpVerNo.find(stuIpPort);
    std::string strSrcproVer;
    if(iter!=m_IpVerNo.end()){
        strSrcproVer=iter->second;
        //std::cout << iter->first << " " << iter->second << std::endl;
        
        std::cout <<" strSrcproVer " << strSrcproVer << std::endl;
    }
    #endif
    
	
	
	#if 1
    
	for (auto iter = m_IpVerNo.begin(); iter != m_IpVerNo.end(); ++iter) {
        std::cout <<" version" << iter->second << std::endl;
    }
	#endif
	
	
	return 0;
}

执行结果:

root@debian:~/code# ./a.out
 version1500
 version1200
 version1100

unordered_map结论: 1.存在唯一键值(键不允许重复)

                                    2.等号插入更新键值,再次insert不会更新之前的键值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值