map和set对vector排序

一、例题引入

天梯赛 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;
}
posted @ 2024-04-20 00:09  光風霽月  阅读(7)  评论(0编辑  收藏  举报