可变优先级队列允许键增加
Mutable priority queue allowing key increase
在实现图搜索算法时,我需要一个允许优先级更改的优先级队列。到目前为止,我一直在使用(detail
命名空间,因此未记录)boost
d_ary_heap_indirect
,但刚刚被告知优先级增加是未定义的(我现在看到概念文档中也提到了这一点)。
所以,我需要找到一个允许增加和减少的结构。我已经尝试过简单地使用vector
和push_heap
/pop_heap
/make_heap
,但是更新太慢了。还有其他选择吗?我看到boost在挂起的(同样没有文档的)目录中有两个类,mutable_queue
和relaxed_heap
,但我只能在五年前的邮件列表线程中找到它们。它们之间的区别是什么?它们是否允许增加和减少?是否有任何尚未被接受的实现?
将值放入堆中。您所需要做的就是修改该值,然后通过向上或向下冒泡来恢复堆不变量。
回想一下,堆本质上是一棵二叉树,其中每个节点都大于它的两个子节点。
所以如果你增加一个节点的值,你检查它是否比它的父节点大,如果是,交换它们,然后重复把节点拉向树的根,直到节点不再需要交换。
如果你减少了一个节点的值,那么如果你现在小于你的两个子节点中最大的一个。重复将节点推向树的叶子,直到不再需要交换为止。
MultiIndex库的特点是容器具有更新对象状态的操作,并将相应地更新索引。
在您的情况下,modify
成员函数似乎适合。来自文档:
struct change_name
{
change_name(const std::string& new_name):new_name(new_name){}
void operator()(employee& e)
{
e.name=new_name;
}
private:
std::string new_name;
};
typedef employee_set::index<name>::type employee_set_by_name;
employee_set_by_name& name_index = es.get<name>();
employee_set_by_name::iterator it = name_index.find("Anna Jones");
name_index.modify(it,change_name("Anna Smith"));
相关文章:
- 数组索引的值没有增加
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么我的代码在输出中增加了93天
- 如何在c++中只将键插入到bimap的一侧
- 使用2个键的cpp-stl::优先级队列排序不正确
- 有效地使用std::unordered_map来插入或增加键的值
- C++映射有2个键,这样任何1个键都可以用来获取值
- 智能指针作为无序映射键,并通过引用进行比较
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 带有数组键C++的二进制映射
- 为什么要增加导致崩溃的指针
- 使用 GLUT 使用键停止动画?
- 无法添加多个键以映射将结构作为键
- 将 std::set 与基于键的比较器一起使用
- 如何使用 std::variant 打印地图键/值?
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 有效地将值插入地图.更好地增加或减少键
- C++映射数组键自动增加
- 可变优先级队列允许键增加