一、例題引入
天梯賽 L2-039 清點程式碼庫
二、程式碼
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
typedef pair<int, vector<int>> PIV;
int n, m;
map<vector<int>, int> cnt;
vector<PIV> res;
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++ )
{
vector<int> tmp;
for(int j = 0; j < m; j ++ )
{
int x; cin >> x;
tmp.push_back(x);
}
cnt[tmp] ++ ;
}
for(auto &[vec, num] : cnt)
res.push_back({-num, vec});
sort(res.begin(), res.end());
cout << res.size() << endl;
for(auto &[num, vec] : res)
{
cout << -num << ' ';
for(int i = 0; i < vec.size(); i ++ )
cout << vec[i] << " \n"[i == vec.size() - 1];
}
return 0;
}
三、原理
\(map\) 可以對 \(vector\) 排序,排序規則:
- 逐個比較元素,如果不相等,按元素大小從小到大排序
- 如果某個長度小的 \(vector\) 遍歷完了,按元素個數從小到大排序
\(set\) 也同理
注意 \(unordered\_map\) 和 \(unordered\_set\) 不可以對 \(vector\) 排序,這應該是因為它們的底層資料結構不同,\(map\) 和 \(set\) 的底層資料結構是紅黑樹,可以實現排序功能,而 \(unordered\_map\) 和 \(unordered\_set\) 的底層資料結構是拉鍊式雜湊表,無法實現排序功能。
測試 \(Demo\):
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <map>
#include <set>
using namespace std;
map<vector<int>, int> cnt;
set<vector<int>> ass;
// unordered_map<vector<int>, int> cnt;
// unordered_set<vector<int>> ass;
int main()
{
vector<int> a[3];
a[0] = {1, 2, 3};
a[1] = {1, 2, 3, 4};
a[2] = {2};
for(int i = 0; i < 3; i ++ )
{
cnt[a[i]] = 1;
ass.insert(a[i]);
}
for(auto &vec : ass)
{
for(auto &x : vec) cout << x << ' ';
cout << endl;
}
for(auto &[vec, num] : cnt)
{
cout << "[" << cnt << "] ";
for(auto &x : vec) cout << x << ' ';
cout << endl;
}
return 0;
}