C++ 用O(1)中的minValue和maxValue实现MinMax PriorityQueue

C++ 用O(1)中的minValue和maxValue实现MinMax PriorityQueue,c++,priority-queue,multimap,minmax,C++,Priority Queue,Multimap,Minmax,我正在std::multimap上实现一个MinMax优先级队列,在一个键上可能有多个值,并且我已经用O(1)时间复杂度编写了函数minKey和maxKey(使用begin()和end() 现在,我在实现minValue和maxValue时遇到了一个问题。其中一个显而易见的解决方案是创建一个数据结构(例如,使用std::set),其中只包含pqueue的值,并且可以访问O(1)中的min和max 显然,这种解决方案的缺点是重复的内存大小,这是我当然不想要的 我正在考虑一个分别指向minValue

我正在std::multimap上实现一个MinMax优先级队列,在一个键上可能有多个值,并且我已经用O(1)时间复杂度编写了函数minKey和maxKey(使用begin()和end()

现在,我在实现minValue和maxValue时遇到了一个问题。其中一个显而易见的解决方案是创建一个数据结构(例如,使用std::set),其中只包含pqueue的值,并且可以访问O(1)中的min和max

显然,这种解决方案的缺点是重复的内存大小,这是我当然不想要的

我正在考虑一个分别指向minValue和maxValue的解决方案。插入到PQ将很容易,只需与这些指针进行比较。。。那搬家呢

插入:我可以在某个键上有多个值

删除:删除某个键中的任何值(如果该键不存在,则引发异常)

对于如何在O(1)时间复杂度中实现minValue和maxValue,您有什么建议吗


提前感谢

让我们重述一下您想要什么。您希望为必须根据两个不同的比较函数进行排序的键值对实现一个双端优先级队列。一个用于比较数据对的关键部分,另一个用于比较值部分

在我看来,一个集装箱的责任太多了。我建议您实现一个仅使用一个比较的优先级队列,并使用两个具有重复内容但不同比较函数的独立优先级队列。当然,这与您的并行
std::set
idea一样复制了数据结构,但是您将实现的更简单的一个比较优先级队列通常会更有用。即使用户只需要存储简单的非对类型,并且不需要多个排序,也可以使用它。如果单个对象的大小较大,则可以将指针存储在一个对象中,以节省复制所占用的空间

忽略一个非常不同的解决方案,比如区间堆,我建议使用键值对的
std::multiset
,而不是
std::multimap
,因为映射永远不会被用来按键查找任意元素。毕竟,您只需要找到第一个和最后一个元素


如果您非常热衷于多重比较规则的设计,那么您可以使用多索引容器来实现队列。有一个这样的容器库。

让我们回顾一下您想要什么。您希望为必须根据两个不同的比较函数进行排序的键值对实现一个双端优先级队列。一个用于比较数据对的关键部分,另一个用于比较值部分

在我看来,一个集装箱的责任太多了。我建议您实现一个仅使用一个比较的优先级队列,并使用两个具有重复内容但不同比较函数的独立优先级队列。当然,这与您的并行
std::set
idea一样复制了数据结构,但是您将实现的更简单的一个比较优先级队列通常会更有用。即使用户只需要存储简单的非对类型,并且不需要多个排序,也可以使用它。如果单个对象的大小较大,则可以将指针存储在一个对象中,以节省复制所占用的空间

忽略一个非常不同的解决方案,比如区间堆,我建议使用键值对的
std::multiset
,而不是
std::multimap
,因为映射永远不会被用来按键查找任意元素。毕竟,您只需要找到第一个和最后一个元素


如果您非常热衷于多重比较规则的设计,那么您可以使用多索引容器来实现队列。有这样的容器库。

C没有
std::multimap
std::set
。标签似乎与你的问题无关。你为什么要添加它?所以,<代码> MimValue/Cuth>函数应该返回最小的值,而不是最小的键中的值?C++已经在STL中有了<代码> PrimyIyQueLe>/代码>。除此之外,您还需要什么额外的功能?@AmitTiwari
std::priority\u queue
是单端的。astose似乎正在实现一个双端优先级队列。正确。minValue必须返回映射中的最小值。我认为唯一的解决方案是复制内存大小,但还有其他选择吗?C没有
std::multimap
std::set
。标签似乎与你的问题无关。你为什么要添加它?所以,<代码> MimValue/Cuth>函数应该返回最小的值,而不是最小的键中的值?C++已经在STL中有了<代码> PrimyIyQueLe>/代码>。除此之外,您还需要什么额外的功能?@AmitTiwari
std::priority\u queue
是单端的。astose似乎正在实现一个双端优先级队列。正确。minValue必须返回映射中的最小值。我认为唯一的解决方案是复制内存大小,但是还有其他选择吗?嗯,我认为使用std::multimap+std::set是最好的选择。在multimap中,我只存储,在std::set中,我只存储V。这样,所有数据都不会重复,我可以不断访问minValue和maxValue。这将不允许您找到min值的键。如果你不需要,那就随你的便。我不需要。现在我有一个复制构造函数的问题,因为它必须在[O(queue.size())]时间复杂度内,所以我既不能使用insert也不能使用find。在multimap上使用=运算符将为我提供指向原始值(而不是复制值)的指针。你对如何实现它有什么想法吗?只需使用c