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不会更新之前的键值