一、std::map是按照键的顺序进行排序的,因此需要定义结构类型的比较运算符。通常情况下,你可以通过重载结构类型的小于运算符<来定义比较逻辑。
- #include <map>
-
- class CKey {
- public:
- CKey(int a) { m_a = a; }
- ~CKey() = default;
-
- //也可以在外部(二选一)
- bool operator< (const CKey &k1) const
- {
- return this->v() < k1.v();
- }
-
- int v() const { return m_a; }
-
- private:
- int m_a;
- };
-
- //也可以在外部(二选一)
- bool operator< (const CKey &k1, const CKey &k2)
- {
- return k1.v() < k2.v();
- }
-
- std::map<CKey, int> map;
- map.emplace(CKey(1), 1);
- map.emplace(CKey(2), 2);
二、如果你无法修改自定义结构类型的定义或不希望修改默认的比较逻辑,你可以使用第三个模板参数来指定自定义的比较函数。比较函数应该接受两个参数,并返回一个布尔值指示它们的相对顺序。
- #include <map>
-
- class CKey {
- public:
- CKey(int a) { m_a = a; }
- ~CKey() = default;
-
- int v() const { return m_a; }
-
- private:
- int m_a;
- };
-
- //自定义比较
- struct color_cmp
- {
- bool operator() (const CKey &k1, const CKey &k2) const
- {
- return k1.v() < k2.v();
- }
- };
-
- //通过第三个模板参数
- std::map<CKey, int, color_cmp> map;
- map.emplace(CKey(1), 1);
- map.emplace(CKey(2), 2);