1. 程式人生 > >關於STL中make_heap()用法

關於STL中make_heap()用法

對make_heap(), pop_heap(), push_heap()的用法做個總結: 
make_heap()生成堆,他有兩個引數,也可以有三個引數,前兩個引數是指向開始元素的迭代器和指向結束元素的下一個元素的迭代器。第三個引數是可選的,可以用偽函式less()和greater()來生成大頂堆和小頂堆,其中type為元素型別。如果只傳入前兩個引數,預設是生成大頂堆。 
push_heap()是在堆的基礎上進行資料的插入操作,引數與make_heap()相同,需要注意的是,只有make_heap()和push_heap()同為大頂堆或小頂堆,才能插入。 
pop_heap()是在堆的基礎上,彈出堆頂元素。這裡需要注意的是,pop_heap()並沒有刪除元素,而是將堆頂元素和陣列最後一個元素進行了替換,如果要刪除這個元素,還需要對陣列進行pop_back()操作。 
若用make_heap(), pop_heap(), push_heap(),需要新增標頭檔案 # include 。 
用less ()和greater () 需要新增標頭檔案 # include 。 
這裡只是描述用法,貼上程式碼如下:

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

using namespace std;

void printVec(vector<int> nums)
{
    for (int i = 0; i < nums.size(); ++i)
        cout << nums[i] << " ";
    cout << endl;
}
int main(void)
{
    int nums_temp[] = {8, 3, 4, 8, 9, 2, 3, 4};
    vector<int> nums(nums_temp, nums_temp + 8);
    cout << "sorce nums: ";
    printVec(nums);

    cout << "(預設)make_heap: ";
    make_heap(nums.begin(), nums.end());
    printVec(nums);

    cout << "(less)make_heap: ";
    make_heap(nums.begin(), nums.end(), less<int> ());
    printVec(nums);

    cout << "(greater)make_heap: ";
    make_heap(nums.begin(), nums.end(), greater<int> ());
    printVec(nums);

    cout << "此時,nums為小頂堆" << endl;;
    cout << "push_back(3)" << endl;
    nums.push_back(3);
    cout << "忽略第三個引數,即為預設)push_heap: ";
    push_heap(nums.begin(), nums.end());
    printVec(nums);
    cout << "第三個引數為greater: ";
    push_heap(nums.begin(), nums.end(), greater<int>());
    printVec(nums);
    cout << "(做替換)pop_heap: ";
    pop_heap(nums.begin(), nums.end());
    printVec(nums);
    cout << "pop_back(): ";
    nums.pop_back();
    printVec(nums);
}

結果為: 
堆的執行結果