L2-039 清點程式碼庫

YuKiCheng發表於2024-03-22

沒有想到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

相關文章