当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Algorithm make_heap()用法及代码示例


C++ 算法 make_heap() 函数用于重新排列范围 [first, last) 中的元素,使它们形成一个堆。

对于第一个版本使用运算符 < 比较元素,或者对于第二个版本使用给定的二进制比较函数 comp 比较元素。

用法

default (1)         template <class RandomAccessIterator>
                      void make_heap (RandomAccessIterator first, RandomAccessIterator last);

custom (2)   template <class RandomAccessIterator, class Compare>
                      void make_heap (RandomAccessIterator first, RandomAccessIterator last,
                                                                            Compare comp );

参数

first:一个随机访问迭代器,指向要转换成堆的范围中的第一个元素。

last:一个随机访问迭代器,指向要转换成堆的范围中过去的最后一个元素。

comp: 一个用户定义的二元谓词函数,它接受两个参数,如果两个参数按顺序返回真,否则返回假。它遵循严格的弱排序来对元素进行排序。

返回值

复杂度

复杂性高达第一个和最后一个之间距离的三倍线性:比较元素并可能交换(或移动)它们直到重新排列为更长的堆。

数据竞争

范围 [first, last) 中的一些对象被修改。

异常

如果任何元素比较、元素交换(或移动)或迭代器上的操作引发异常,则此函数将引发异常。

注意:无效的参数会导致未定义的行为。

例子1

让我们看一个简单的例子来演示 make_heap() 的使用:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
  vector<int> v = {2, 1, 4, 3};

  make_heap(v.begin(), v.end());

  for_each(v.begin(), v.end(), [](int x) {
    cout << x << endl;
  });
  
  return 0;
}

输出:

4
3
2
1

例子2

让我们看另一个简单的例子:

#include <iostream>     // std::cout
#include <algorithm>    // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap
#include <vector>       // std::vector

using namespace std;

int main () {
  int myints[] = {20,10,30,5,13};
  vector<int> v(myints,myints+5);

  make_heap (v.begin(),v.end());
  cout << "initial max heap  :" << v.front() << '\n';

  pop_heap (v.begin(),v.end()); v.pop_back();
  cout << "max heap after pop:" << v.front() << '\n';

  v.push_back(99); push_heap (v.begin(),v.end());
  cout << "max heap after push:" << v.front() << '\n';

  sort_heap (v.begin(),v.end());

  cout << "final sorted range:";
  for (unsigned i=0; i<v.size(); i++)
    cout << ' ' << v[i];

  cout << '\n';

  return 0;
}

输出:

initial max heap  :30
max heap after pop:20
max heap after push:99
final sorted range:5 10 13 20 99

例子3

让我们看另一个使用比较函数将任意整数向量转换为堆的简单示例:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
using namespace std;
 
int main()
{
  int a[] = {15, 27, 16, 20, 30, 100, 3, 16, 7};
  vector<int> v(a, a+9);

  cout <<"\nHere are the values in the vector:\n";
  for (vector<int>::size_type i=0; i<v.size(); i++)
    cout <<v.at(i)<<" ";
 
  cout <<"\nNow we make these values into a (minimum) heap.";
  make_heap(v.begin(), v.end(), greater<int>());
 
  cout <<"\nHere are the revised contents of the vector:\n";
  for (vector<int>::size_type i=0; i<v.size(); i++)
    cout <<v.at(i)<<" ";
 
  return 0;
}

输出:

Here are the values in the vector:
15 27 16 20 30 100 3 16 7 
Now we make these values into a (minimum) heap.
Here are the revised contents of the vector:
3 7 15 16 30 100 16 27 20  

示例 4

让我们看一个简单的例子:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
 
int main()
{
    vector<int> v { 3, 1, 4, 1, 5, 9 };
 
    cout << "initially, v:";
    for (auto i:v) cout << i << ' ';
    cout << '\n';
 
    make_heap(v.begin(), v.end());
 
    cout << "after make_heap, v:";
    for (auto i:v) cout << i << ' ';
    cout << '\n';
 
    pop_heap(v.begin(), v.end());
    auto largest = v.back();
    v.pop_back();
    cout << "largest element:" << largest << '\n';
 
    std::cout << "after removing the largest element, v:";
    for (auto i:v) cout << i << ' ';
    cout << '\n';

return 0;
}

输出:

initially, v:3 1 4 1 5 9 
after make_heap, v:9 5 4 1 1 3 
largest element:9
after removing the largest element, v:5 3 4 1 1





相关用法


注:本文由纯净天空筛选整理自 C++ Algorithm make_heap()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。