我正在使用C ++编写一个应用程序,其中我需要实现一个消息队列,该消息队列将不断从网络接收数据(即对象),每个对象都有一个密钥(例如公司名称,例如Oracle,Google等)。如果队列使用者较慢,则队列中可以包含大量元素(最大限制可以保持数百万个)。
要求是:如果具有XYZ键的对象是从网络到达的,并且队列中已有具有XYZ键的对象,那么我需要重写该对象,并且该对象在队列中的位置应保持不变。例如,如果键“ Oracle”的值为25的对象是从网络到达的,并且键为“ Oracle”且值为10的对象已存在于队列中的位置120,那么我需要覆盖值为25的值10并且位置应保持在120。
我尝试使用线程安全队列和集合来实现此目的,首先从网络到达对象时,我检查集合中是否存在密钥,如果不存在密钥,则将密钥添加到集合中并在队列中添加对象。如果存在密钥,那么我将在队列中执行线性搜索,以覆盖该对象。
如果我非常频繁地更新队列中已经存在的密钥,性能将会非常慢。
有没有有效的方法来实现这一目标?预先感谢。
答案 0 :(得分:1)
由于未对队列进行排序,因此没有比线性搜索更快的数据获取方法。 您可以优先使用队列。 std :: priority_queue不允许快速更改优先级,您将不得不使用boost。
您也可以尝试以下算法:
queue[index -count]
(线性时间)的值map[key] = count + index where the new item is placed in the queue
(线性摊销时间)我不提供任何担保,我尚未测试此算法。