zoukankan      html  css  js  c++  java
  • 结构体作为map的key或放入set中,需要重载<运算符

    结构体作为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的value
    struct 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();
            }
        };
    }

  • 相关阅读:
    Java代码:response压缩响应
    SpringBoot框架:第一章:基础配置和介绍
    asp.net 发送email
    .NET环境下水晶报表使用总结
    ASP.net(c#)生成条形码
    表格操作类(添加,删除,排序,上移,下移)
    NET email
    C#如何打印条形码EAN13码
    在asp.net中备份还原SQL Server数据库
    配置SQL2000数据库发送邮件
  • 原文地址:https://www.cnblogs.com/fvsfvs123/p/3160687.html
Copyright © 2011-2022 走看看