map和set對vector排序

光風霽月發表於2024-04-20

一、例題引入

天梯賽 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\) 排序,排序規則:

  1. 逐個比較元素,如果不相等,按元素大小從小到大排序
  2. 如果某個長度小的 \(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;
}

相關文章