STL中的map使用struct/class作为关键字的例子

STL中的map使用struct/class作为关键字的例子 佟强 2008.11.5

    map的元素是由key和value两个分量组成的对偶(key,value)。key是键,value是与键key相关联的映射值。元素的键key是唯一的,给定一个key,就能唯一地确定与其相关联的另一个分量value。

    map中如果使用struct或者class作为key,需要实现复制构造函数,重载操作符“=”和“<”,下面代码举例说明如何使用class作为key。

  1. //MyMap2.cpp
  2. #include <iostream>
  3. #include <map>
  4. using namespace std;
  5. class MyIpNode{
  6. public:
  7.     unsigned long sourceIp;
  8.     unsigned long destIp;
  9.     unsigned char protocol;
  10.     MyIpNode(){
  11.         cout<<"------------默认构造函数"<<endl;
  12.         sourceIp=0;
  13.         destIp=0;
  14.         protocol=0;
  15.     }
  16.     MyIpNode(const MyIpNode& node){
  17.         cout<<"------------复制构造函数"<<endl;
  18.         sourceIp = node.sourceIp;
  19.         destIp = node.destIp;
  20.         protocol = node.protocol;
  21.     }
  22.     MyIpNode& operator =(const MyIpNode& node){
  23.         cout<<"------------操作符/"=/""<<endl;
  24.         sourceIp = node.sourceIp;
  25.         destIp = node.destIp;
  26.         protocol = node.protocol;
  27.         return *this;
  28.     }
  29.     friend bool operator<(const MyIpNode &a,const MyIpNode &b){
  30.         cout<<"------------操作符/"</""<<endl;
  31.         if(a.sourceIp<b.sourceIp){
  32.             return true;
  33.         }else if(a.sourceIp>b.sourceIp){
  34.             return false;
  35.         }else if(a.destIp<b.destIp){
  36.             return true;
  37.         }else if(a.destIp>b.destIp){
  38.             return false;
  39.         }else if(a.protocol<b.protocol){
  40.             return true;
  41.         }else if(a.protocol>b.protocol){
  42.             return false;
  43.         }else{
  44.             return false;
  45.         }
  46.     }
  47. };
  48. int main(int argc, char* argv[]){
  49.     map<MyIpNode,int> ipCounterMap;
  50.     MyIpNode myNode;
  51.     myNode.destIp=1;
  52.     myNode.sourceIp=5;
  53.     myNode.protocol=1;
  54.     ipCounterMap[myNode] = 10;
  55.     myNode.destIp=2;
  56.     myNode.sourceIp=6;
  57.     myNode.protocol=8;
  58.     ipCounterMap[myNode] = 20;
  59.     MyIpNode myNode2;
  60.     myNode2.destIp=1;
  61.     myNode2.sourceIp=5;
  62.     myNode2.protocol=1;
  63.     int a = ipCounterMap[myNode2];
  64.     cout<<a<<endl;
  65.     myNode2.destIp=2;
  66.     myNode2.sourceIp=6;
  67.     myNode2.protocol=8;
  68.     a = ipCounterMap[myNode2];
  69.     cout<<a<<endl;
  70.     map<MyIpNode,int>::const_iterator it;
  71.     MyIpNode node;
  72.     int counter;
  73.     for(it=ipCounterMap.begin(); it!=ipCounterMap.end(); it++){
  74.         node = it->first;
  75.         counter = it->second;
  76.         cout<<"/tIpNode("<<node.sourceIp<<", "<<node.destIp<<", "<<(int)(node.protocol)<<") = "<<counter<<endl;
  77.     }
  78.     return 0;
  79. }
原文地址:https://www.cnblogs.com/zhangyunlin/p/6168124.html