Sort/Reverse
これを書いておく。
#define all(a) a.begin(), a.end()
#define reverse_all(a) a.rbegin(), a.rend()
降順ソート
数値
vector<int> a = {4, 2, 3, 1, 5};
reverse(all(a));
for (int i = 0; i < 5; i++) {
cout << a[i] << " ";
}
output
5 4 3 2 1
or
vector<int> a = {4, 2, 3, 1, 5};
sort(reverse_all(a));
for (int i = 0; i < 5; i++) {
cout << a[i] << " ";
}
output
5 4 3 2 1
文字列
string str = "abcdefg";
reverse(all(str));
cout << str << std::endl;
gfedcba
pair型
reverseはただ配列の順序を逆順にする。
vector<pair<int, int>> a = {make_pair(3,1), make_pair(4,2), make_pair(2,3)};
reverse(all(a));
for(pair<int, int> v:a){
cout << v.first << " " << v.second << endl;
}
このように、第一要素が降順にならないので。
output
2 3
4 2
3 1
第一要素を降順にしたい場合は、sortしてからreverseする。
vector<pair<int, int>> b = {make_pair(3,1), make_pair(4,2), make_pair(2,3)};
// sortして第一要素を昇順にする!!!
sort(all(b));
// 順序を逆にする
reverse(all(b));
for(pair<int, int> v:b){
cout << v.first << " " << v.second << endl;
}
第一要素が降順になった。めでたし。
output
4 2
3 1
2 3
昇順ソート
vector<int> a = {4, 2, 3, 1, 5};
sort(all(a));
for (int i = 0; i < 5; i++) {
cout << a[i] << " ";
}
output
1 2 3 4 5
pair型の場合は一つ目の値を基準にsortされる。(一つ目の値が同じであった場合は、二つ目の値を基準にsortされる。)
vector<int> a = {make_pair(3,7), make_pair(2,8), make_pair(1,2)};
sort(all(a));
for(pair<int, int> v:a){
cout << v.first << " ";
}
output
1 2 3
参考
sort - cpprefjp C++日本語リファレンス
rbegin - cpprefjp C++日本語リファレンス
ABC222 C - Swiss-System Tournament
ABC219 C - Neo-lexicographic Ordering