哪个C ++ STL容器提供`extract_max()`,`find(element_value)`和`modify(element)`功能?

时间:2014-08-19 21:08:51

标签: c++ stl

我想使用C ++ STL容器来实现Prim's algorithm。我需要extract_maxfind(element)modify(element_value)功能,但std::priority_queue仅提供extract_max。我可以使用其他容器吗?显然,我希望所有这些都尽可能快。

编辑:容器还应提供修改其元素值的功能。

1 个答案:

答案 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