搜尋

首頁  >  問答  >  主體

C++ 模板 map 如何根据 key 排序

定义了一个

template <typename T>
std::map<const T, std::list<const T>*> map;

实际使用时 T 可能会是 char*,也可能是 long
需要针对 T 的类型进行排序,可是单纯使用

struct CompareByLongValue {
    bool operator()(const long& k1, const long& k2) {
        return k1 < k2;
    }
};

或是添加 template 声明后强制转换都编译过不去,求解


忧郁的更新:

实际上,我想将上面的那个 map 放到一个模板类里面去,在类内部实际上只
支持为数不多的类型操作,比如 long, char*,所以想在类内部自动排序。

template <typename T>
class Mapping {
   public:
    Mapping();
    virtual ~Mapping();

   private:
    std::map<const T, std::list<const T>*>* mapping_;
};

如果在 map 定义的时候传入一个如下定义的结构体:

template <typename T>
struct CompareByLongValue {
    bool operator()(const T& k1, const T& k2) { return k1 < k2; }
};

编译器会不乐意:

No matching function for call to object of type 'const CompareByLongValue<long>'

分别在 stl map 的:

    _LIBCPP_INLINE_VISIBILITY
    bool operator()(const _CP& __x, const _Key& __y) const
        // 460
        {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);}
    _LIBCPP_INLINE_VISIBILITY
    bool operator()(const _Key& __x, const _CP& __y) const
        // 463
        {return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);}

// 以及 1207
if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
ringa_leeringa_lee2803 天前543

全部回覆(2)我來回復

  • 黄舟

    黄舟2017-04-17 13:15:05

    map 預設的比較物件的類型是 std::less

    你可以看一下map的定義:

    template<
        class Key,
        class T,
        class Compare = std::less<Key>,
        class Allocator = std::allocator<std::pair<const Key, T> >
    > class map;
    

    如果你要修改預設的比較行為,可以在建構時傳入你定義的比較類別:map amap;

    如果你的「map"變數是一個未指定具體類型的map類型, 那一種做法就是Compare 也定義成一個模板類別: map > amap;
    然後定義特化的MyCompare類別。

    template <> class MyCompare<long>
    {
        bool operator()(const long& a, const long& b) const
        {
            ...
        }
    }
    

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:15:05

    long,char* 都不需要自訂比較啊。
    你的
    template
    std::map*> map;

    是不是想寫成
    template
    using m_map=std::map*> map;
    ?

    回覆
    0
  • 取消回覆