我有一组相当大的对象代表数字,我想根据自定义顺序选择这样的数字。这种排序包括几个标准,例如它们的表示类型(一些数字用间隔表示),它们的完整性和最终它们的值。这些数字在整个程序中共享(共享指针),我无能为力。
但是,元素属性可以随时更改,以便订单更改,而我无法通知容器。例如,某些操作需要对由间隔表示的数字进行细化,并且在此细化期间,可以找到确切的值。因此,数字从区间表示变为有理数,甚至可能是整数。由于共享实例,此更改会立即传播到容器中的数字并中断排序(我甚至不知道哪个数字已更改)。这完全打破std::set
。
所以我想要的是一个尝试排序的容器,但不依赖于此。只要操作检测到错误排序,就应该在本地更正此顺序。例如insert
将插入元素(使用二进制搜索)并始终检查当前元素(w.r.t.邻居)的顺序是否正确。
我愿意接受“给我最小的元素”然后只会“给我一个小元素”而且find
或remove
会有线性的复杂性:我只需要<{1}},front
和insert
特别有效。
是否有任何类似的实现? 你会如何实现这个?
答案 0 :(得分:1)
如果您正在寻找标准库中的算法,您应该看看:
std::make_heap
std::pop_heap
std::push_heap
在<algorithm>
。它们可能符合您的需求,即使它们不适合我也很确定您会在某种堆结构中找到您正在寻找的东西。哪一个可能取决于您的代码的结构,以及您期望值更改的频率等。
简而言之:
堆是一种数据结构,可以快速查找并提取最小(或最大)的元素。对于大多数堆来说,也可以在线性时间或更好的时间内重建堆。如果您想了解有关堆的更多信息,可以从this page on Wikipedia开始。