结构体作为map的key或放入set中,需要重载<运算符

发布时间:2016-12-10 18:49:46 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"结构体作为map的key或放入set中,需要重载<运算符",主要涉及到结构体作为map的key或放入set中,需要重载<运算符方面的内容,对于结构体作为map的key或放入set中,需要重载<运算符感兴趣的同学可以参考一下。

http://blog.csdn.net/guang11cheng/article/details/7012007 结构体作为map的key或放入set中,需要重载<运算符,如下:typedef struct tagRoadKey{    int m_i32Type;    int m_i32Scale;    bool operator <(const tagRoadKey& other) const // 注意是const函数!!    {        if (m_i32Type != other.m_i32Type) // 类型按升序排序        {            return (m_i32Type < other.m_i32Type);        }        else // 如果类型相同,按比例尺升序排序        {            return (m_i32Scale < other.m_i32Scale);        }    }} RoadKey;也可以重载>运算符,示例如下:#include <iostream>#include <string>#include <map>using namespace std;class Array{private:    int m_i32Num1;    int m_i32Num2;public:    Array(int i32Num1, int i32Num2);    bool operator >(const Array& other) const;};Array::Array(int i32Num1, int i32Num2){    m_i32Num1 = i32Num1;    m_i32Num2 = i32Num2;}bool Array::operator >(const Array& other) const{    if (m_i32Num1 > other.m_i32Num1)    {        return true;    }    else    {        return false;    }}// 此结构体作为map的valuestruct TInfo{    int m_i32Num1;    int m_i32Num2;};int main(int argc, char* argv[]){    map<Array, TInfo, greater<Array> > stMap;    TInfo stInfo1 = { 1, 1};    stMap.insert(pair<Array, TInfo>(Array(1, 2), stInfo1));    TInfo stInfo2 = { 2, 1, 1 };    stMap.insert(pair<Array, TInfo>(Array(2, 2), stInfo2));    TInfo stInfo3 = { 3, 1, 1 };    stMap.insert(pair<Array, TInfo>(Array(3, 2), stInfo3));    for (map<Array, TInfo, greater<Array> >::iterator it = stMap.begin(); it != stMap.end(); ++it)    {        cout << it->second.m_i32Num1 << endl;    }    return 0;}说明: map缺省是用less<Key>作为比较器,所以它要求作为Key的类要重载“<”操作符,没有重载“<”操作符,而是重载了“>”操作符就会报错。反之,也可以显式地用greater<Key>作为比较器,此时就必要重载Key类中的“>”操作符了。附:stl中map和set的声明,二者比较像,底层都是用红黑树实现的template < class Key, class Compare = less<Key>,           class Allocator = allocator<Key> > class set;template < class Key, class T, class Compare = less<Key>,           class Allocator = allocator<pair<const Key,T> > > class map; template < class Key, class Compare = less<Key>,           class Allocator = allocator<Key> > class multiset; template < class Key, class T, class Compare = less<Key>,           class Allocator = allocator<pair<const Key,T> > > class multimap; 从上面的声明可以看出,也可以定义一个函数对象Compare,声明map或set类型时传进入,如:struct TTimeCompare{    bool operator ()(const CTimerEvent* po1, const CTimerEvent* po2)const    {                return (po1->m_oNextTick < po2->m_oNextTick);    }};typedef multiset<CTimerEvent*, TTimeCompare> TEventSet;struct ltstr // less than{    bool operator()(const char* s1, const char* s2) const    {        return strcmp(s1, s2) < 0;    }};set<const char*, ltstr> stSet; // set<Key, Compare, Alloc>map<const char*, int, ltstr> stMap; // map<Key, Data, Compare, Alloc>struct eqstr // equal{    bool operator()(const char* s1, const char* s2) const    {        return strcmp(s1, s2) == 0;    }};hash_map<const char*, int, hash<const char*>, eqstr> stHashMap;  // hash_map<Key, Data, HashFcn, EqualKey, Alloc>// 自定义hash函数namespace std{    template<>    struct hash<KEY_TYPE>    {        size_t operator()(const KEY_TYPE& key) const        {            //return key.Hash();        }    };}

上一篇:WPF之XMAL对象引用总结
下一篇:linux id命令参数及用法详解(linux查看当前登陆用户uid,gid)

相关文章

相关评论