沒有想到map的key可以是陣列型別,本質是vector模板中運算子的過載。
1.==過載:
判斷兩個陣列是一樣的,含義是兩個vector大小相同,並且固定位置上的值要相等。
//stl_vector.h
template <class T, class Alloc>
inline bool operator==(const vector<T, Alloc>& x, const vector<T, Alloc>& y) {
return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
}
//stl_algobase.h
template <class InputIterator1, class InputIterator2>
inline bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2) {
for ( ; first1 != last1; ++first1, ++first2)
if (*first1 != *first2)
return false;
return true;
}
2.<過載:
元素挨個比較,若第一個陣列小於第二個陣列對應位置上的值返回true。如果都相等,那最後第一個長度比第二個小,返回true。就是先比較值,值一樣比較長度。
//stl_vector.h
template <class T, class Alloc>
inline bool operator<(const vector<T, Alloc>& x, const vector<T, Alloc>& y) {
return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
}
//stl_algobase.h
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2) {
for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) {
if (*first1 < *first2) //比較陣列中儲存的值
return true;
if (*first2 < *first1)
return false;
}
return first1 == last1 && first2 != last2;
}
本題透過map直接就能去重。
#include <bits/stdc++.h>
using namespace std;
map<vector<int>, int> mp;
bool cmp(pair<vector<int>,int> p1,pair<vector<int>,int> p2) {
if (p1.second != p2.second) {
return p1.second > p2.second;
}
for (int i = 0; i < p1.first.size(); i++) {//遞增序排序
if (p1.first[i] != p2.first[i]) {
return p1.first[i] < p2.first[i];
}
}
return -1;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
vector<int> vec;
for (int j = 0; j < m; j++) {
int output;
cin >> output;
vec.push_back(output);
}
mp[vec]++;//次數增加
}
//放到vector當中進行排序
vector < pair<vector<int>, int>> res;//模組是什麼 模組出現的次數
for (auto x : mp) {
res.push_back(x);
}
sort(res.begin(), res.end(), cmp);
cout << res.size() << '\n';
for (int i = 0; i < res.size(); i++) {
vector<int> x = res[i].first;
int cnt = res[i].second;
cout << cnt << " ";
for (int j = 0; j < x.size(); j++) {
cout << x[j];
if (j < x.size() - 1) cout << " ";
}
cout << '\n';
}
return 0;
}
參考部落格: https://blog.csdn.net/Czyaun/article/details/104444522