我想使用C ++ STL容器来实现Prim's algorithm。我需要extract_max
,find(element)
和modify(element_value)
功能,但std::priority_queue
仅提供extract_max
。我可以使用其他容器吗?显然,我希望所有这些都尽可能快。
编辑:容器还应提供修改其元素值的功能。
答案 0 :(得分:3)
将您的元素推送到std::set<T, std::greater<T>>
,这是一个有序堆。
*set::begin()
以获取O(1)或O(log(n))上的max元素,具体取决于set::begin()
的实现方式。set::find
在O(log(n))中执行搜索。make_heap
和朋友)。在没有必要的情况下可能存在答案,但是(A)你必须对成员用于比较和平等的成员感到偏执,并且(B)速度的差异非常小。所以没有通用容器以这种方式工作。std::multiset
代替,否则相同。示例:
#include <iostream>
#include <set>
int main()
{
std::set<int, std::greater<int>> v { 3, 1, 4, 1, 5, 9 };
std::cout << "initially, v: ";
for (auto i : v) std::cout << i << ' ';
std::cout << '\n';
auto largest = *v.begin();
v.erase(v.begin());
std::cout << "largest element: " << largest << '\n';
std::cout << "after removing the largest element, v: ";
for (auto i : v) std::cout << i << ' ';
std::cout << '\n';
}
<强> Live demo 强>