系列文章目录
(在新文章发布后会添加在此处)
前言
- 本文是 C++ 中的 STL 的方法的简述,基本上都依赖于
algorithm
库。本文基于演讲CPPCON 2018 一小时讲完 105 个 STL 算法,本人学艺不精,讲述较为粗浅还请大佬们多多包涵。 - 本文不是数据结构的讲解,默认读者理解文章中提到的数据结构的意义,本文仅用于简述函数。
- 本文的示例代码是连贯代码,若发现输出数据和想象中的有所差别不妨看看上一个输出结果。
系列常用函数
本系列文章中将会用到一些函数便于代码的书写,以下是本文中将会用到的代码原型:
void print_title(const string& title) {
cout << "---------- " << title << " ----------" << endl;
}
void print_vector(vector<int> vec) {
const ostream_iterator<int> out_iter(cout, " ");
copy(vec.begin(), vec.end(), out_iter);
cout << endl;
}
const vector<int> EXAMPLE = {2, 4, 3, 6, 7, 9, 5};
函数简述
make_heap
- 重载形式:该函数有两个重载,分别是
make_heap(_RanIt _First, _RanIt _Last)
和make_heap(_RanIt _First, _RanIt _Last, _Pr _Pred)
。 - 用途:将一个容器以大顶堆/小顶堆的形式排序,就地建堆。
- 返回值:void
- 参数:
_First
表示指向开始元素的迭代器,_Last
表示指向末尾元素的迭代器,_Pr_Pred
表示用作比较的函数,默认为less<>()
,建立的是大顶堆。用作参数的函数可以自行编写。
print_title("make_heap");
vector<int> temp = EXAMPLE;
make_heap(temp.begin(), temp.end());
print_vector(temp);
make_heap(temp.begin(), temp.end(), greater<>());
/*
---------- make_heap ----------
9 7 5 6 4 3 2
2 4 3 6 7 9 5
*/
push_heap
- 重载形式:同上两种
- 用途:在认为除最后一个元素为正确排序的堆的情况下,将最后一个元素正确添加到堆中。
- 返回值:void
- 参数:同上,其中
_Last
表示需要添加到堆中的元素。 - 注意事项:如果你给出的原堆不符合你在
Pr_Pred
中定义的规则,该堆不会完全自动修正,该算法只负责最后一个元素的正确添加(会调整需要调整的元素)。
print_title("push_heap");
temp.push_back(8);
// 会发现输出的其实不是大顶堆
push_heap(temp.begin(), temp.end());
print_vector(temp);
temp = EXAMPLE;
make_heap(temp.begin(), temp.end());
temp.push_back(8);
// 这样输出就是大顶堆了
push_heap(temp.begin(), temp.end());
print_vector(temp);
/*
---------- push_heap ----------
8 2 3 4 7 9 5 6
9 8 5 7 4 3 2 6
*/
pop_heap
- 重载形式:同上两种
- 用途:在认为堆为正确排序的堆的情况下,第一个元素伪弹出并修正相关的元素。
- 返回值:void
- 参数:同上。
- 注意事项:伪弹出指的是仅将第一个元素放到最后但是不删除。如果你给出的原堆不符合你在
Pr_Pred
中定义的规则,该堆不会完全自动修正,该算法只负责第一个元素的正确伪弹出(会调整需要调整的元素)。
print_title("pop_heap");
temp = EXAMPLE;
// 这样输出的不是大顶堆
pop_heap(temp.begin(), temp.end());
print_vector(temp);
make_heap(temp.begin(), temp.end());
pop_heap(temp.begin(), temp.end());
print_vector(temp);
/*
---------- pop_heap ----------
4 7 3 6 5 9 2
7 6 4 2 5 3 9
*/
章后记
观察 pop_heap
会发现在原堆是正确的情况下,就是将最大的元素放到最后一位,那如果做多次这个操作结果是什么?一个逆序排序的向量,这就是堆排序。下一章将会简述排序相关的内容。