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();
            }
        };
    }

  • 相关阅读:
    laravel的workflow流程插件
    [php]laravel框架容器管理的一些要点
    laravel 自带消息notification通知
    laravel5.5的定时任务详解(demo)
    Laravel核心代码学习
    laravel 加载指定版本的mongodb
    Linux安装Composer
    composer全量镜像使用方法
    laravel在github地址
    node anyproxy ssi简易支持
  • 原文地址:https://www.cnblogs.com/fvsfvs123/p/3160687.html
Copyright © 2011-2022 走看看