C++ map中使用私有类型做key为什么必须要重载<

26 篇文章 0 订阅

请参考map的底层存储机制,为了提高效率,一般都会采用红黑树进行存储,这就导致每次插入或者删除节点时都会调整树的结构,这个操作就需要知道新旧节点之间的关系

对于自定义类型,重载其<运算符。

以下代码调试通过,可直接使用。

#include <map>
#include <iostream>
#include <cstdint>
 
template<typename T1, typename T2>
class Order {
public:
    Order(T1 value, T2 mount) : m_value(value), m_mount(mount) {}
    virtual ~Order() {}
 
    bool operator <(const Order& order) const {
        if ((order.m_value < m_value)
            || (order.m_value == m_value) && (order.m_mount < m_mount)) {
            return false;
        }

        return true;
    }
 
    T1 getValue() const
    {
        return m_value;
    }
 
    T2 getMount() const
    {
        return m_mount;
    }
 
private:
    T1 m_value;
    T2 m_mount;
};
 
int main()
{
    std::map<Order<float, uint64_t>, int> orderQueue;
    Order<float, uint64_t> order_1(16.29, 20000);
    Order<float, uint64_t> order_2(16.22, 10000);
    orderQueue.insert({order_1, 15});
    orderQueue.insert({order_2, 17});
 
    for (auto o : orderQueue) {
        std::cout << o.first.getValue() << std::endl;
    }
 
    std::map<Order<uint32_t, uint64_t>, int> orderQueue2;
    Order<uint32_t, uint64_t> order_3(16, 20000);
    Order<uint32_t, uint64_t> order_4(17, 10000);
    orderQueue2.insert({order_3, 19});
    orderQueue2.insert({order_4, 20});
 
    for (auto o : orderQueue2) {
        std::cout << o.first.getValue() << std::endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值