读书人

地图 key 使用自定义结构这个应该如

发布时间: 2013-01-23 10:44:49 作者: rapoo

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.定义的小于关系是否和相等关系冲突

读书人网 >C++

热点推荐