📅  最后修改于: 2023-12-03 14:54:41.559000             🧑  作者: Mango
在数据结构相关问题中经常会出现需要按照元素频率对数组进行排序的需求,STL中的map
和priority_queue
可以帮助我们实现这个功能。本篇文章将介绍如何使用STL对数组进行按频率排序。
map
的使用map
是STL中用于实现键值对映射的关联容器,通过map
我们可以将元素和出现次数映射起来,键值为元素,值为出现次数。为了实现按频率排序,我们可以将映射后的元素和其出现次数存储在一个vector
中,然后使用sort
函数和一个自定义的比较函数将其排序。
以下是使用map
实现按频率排序的示例代码:
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
bool cmp(pair<int, int> p1, pair<int, int> p2) {
if (p1.second != p2.second) {
return p1.second > p2.second; // 按照出现次数从大到小排序
} else {
return p1.first < p2.first; // 出现次数相等时,按元素从小到大排序
}
}
int main() {
int arr[] = { 1, 2, 2, 3, 4, 4, 4, 5 };
int n = sizeof(arr) / sizeof(int);
map<int, int> mp;
for (int i = 0; i < n; i++) {
mp[arr[i]]++;
}
vector<pair<int, int>> v(mp.begin(), mp.end());
sort(v.begin(), v.end(), cmp);
for (auto p : v) {
cout << p.first << " " << p.second << endl;
}
return 0;
}
输出结果为:
4 3
2 2
1 1
3 1
5 1
priority_queue
的使用priority_queue
是STL中用于实现优先队列的容器,每次取出元素时会自动弹出优先级最高的元素。为了实现按频率排序,我们可以将元素和出现次数封装在一个结构体中,并且重载<
运算符,按照出现次数从大到小排列。
以下是使用priority_queue
实现按频率排序的示例代码:
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
struct Node {
int val;
int cnt;
bool operator < (const Node &rhs) const { // 重载 < 运算符
return cnt < rhs.cnt;
}
};
int main() {
int arr[] = { 1, 2, 2, 3, 4, 4, 4, 5 };
int n = sizeof(arr) / sizeof(int);
unordered_map<int, int> mp;
for (int i = 0; i < n; i++) {
mp[arr[i]]++;
}
priority_queue<Node> pq;
for (auto p : mp) {
pq.push({ p.first, p.second });
}
while (!pq.empty()) {
cout << pq.top().val << " " << pq.top().cnt << endl;
pq.pop();
}
return 0;
}
输出结果为:
4 3
2 2
1 1
3 1
5 1
使用STL中的map
和priority_queue
可以很方便地实现按频率排序的功能。需要注意的是,在使用map
时需要自定义比较函数,而在使用priority_queue
时需要重载<
运算符。