首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

地图 key 使用自定义结构,这个应该如何实现比较函数

2013-01-23 
map key 使用自定义结构,这个应该怎么实现比较函数?struct Info{ int A int B int c}Info srcInfo de

map key 使用自定义结构,这个应该怎么实现比较函数?
struct Info
{
 int A;
 int B;
 int c;
};

Info src;
Info des;
key相当的条件是
src.A==des.B&& src.B==des.A  ||  src.A==des.B&& src.B==des.A
这个比较函数该怎么写?
map<Info,int>mapInfo;//要使用这样的map。 map?自定义?结构体?key?c++
[解决办法]
你要的是一個比較函數,參看下面的sample,然後按你自己的需要寫一個。

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

bool fncomp (char lhs, char rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const char& lhs, const char& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  map<char,int> first;

  first['a']=10;
  first['b']=30;
  first['c']=50;
  first['d']=70;

  map<char,int> second (first.begin(),first.end());

  map<char,int> third (second);

  map<char,int,classcomp> fourth;                 // class as Compare

  bool(*fn_pt)(char,char) = fncomp;
  map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare

  return 0;
}

[解决办法]
不但要确定key的相等,还要确定key的大小关系,即哪个k1,k2哪个排在前面,哪个排在后面。

按你的需求,可能要用复合的方法,可以试试用firstOfKey和secondOfKey的乘积。

struct  myMapFunctor
{
     bool  operator()( const  keyOfMap& k1,  const  keyOfMap& k2)  const
    {
long long key1= k1.firstOfKey*k1.secondOfKey;
long long key2= k2.firstOfKey*k2.secondOfKey;
         if (key1 < key2)
             return   true ;
         else
             return   false ;
    }
};

== 还是要重载
bool operator==( const keyOfMap& k1, const keyOfMap& k2 )
{
 return ( ( k1.firstOfKey ==k2.firstOfKey  &&k1.secondOfKey == k2.secondOfKey) 
[解决办法]
 ( k1.firstOfKey ==k2.secondOfKey&&k1.secondOfKey == k2.firstOfKey  ) );

[解决办法]
==不需要实现,
map确定相等的原理是 f(A,B)为假且f(B,A)为假时确定向等,
典型的就是A<B不成立且B<A不成立时确定向等
[解决办法]
map通过两个<来判断是否相等,不用==。

所以你的问题是:
1.如何定义两个Info小于关系
2.定义的小于关系是否和相等关系冲突

热点排行