基本タイプ
デフォルトでは、キーと値のペアはキーのサイズに応じて小さいものから大きいものの順に並べ替えられます。
map<int,int> mp;
図に示すように、int -> int 型のマップが定義されており、そこに複数のキーと値のペアが挿入される場合、キーと値のペアはキーのサイズに基づいて、小さいものから大きいものまで整理されること。
例
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<int,int> mp;
mp[9] = 1;
mp[100] = 1;
mp[1] = 1;
for (auto it = mp.begin(); it != mp.end(); it++) {
printf("%d -> %d\n",it->first, it->second);
}
return 0;
}
操作結果:
1 -> 1
9 -> 1
100 -> 1
キーのサイズに応じて、キーと値のペアを最大から最小の順に並べ替えます。
キーのサイズに応じて大きいものから小さいものまで並べ替えたい場合、どのように設定すればよいでしょうか? マップの最下層はセットに似た赤黒ツリーを使用して実装されているため、セットと同様の並べ替えルールを追加できます。
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<int,int,greater<int> > mp; // 不同之处,有第三个参数
mp[9] = 1;
mp[100] = 1;
mp[1] = 1;
for (auto it = mp.begin(); it != mp.end(); it++) {
printf("%d -> %d\n",it->first, it->second);
}
return 0;
}
演算結果
100 -> 1
9 -> 1
1 -> 1
マップ内のキーと値のペアが、キーのサイズに応じて大きいものから小さいものへと並べ替えられていることがわかります。
キーとしてのカスタム構造体
自己定義の構造をキーとして使用する場合は、構造の照合順序をカスタマイズする必要があります。または、マップの最下層が赤黒ツリーを使用して実装されているため、その並べ替えルールはsort and setと同じで、priority_queueとは逆になります。
#include <bits/stdc++.h>
using namespace std;
struct node {
int x, y;
node () {
}
node (int _x, int _y) : x(_x), y(_y) {
}
bool operator < (const node &b) const {
if (x != b.x) return x > b.x; // x大的在前
else return y > b.y; // x相同时,y大的在前
}
};
map<node,int> mp;
int main()
{
mp[node(100,1)] = 1;
mp[node(1,200)] = 1;
mp[node(100,200)] = 1;
for (auto cur : mp) {
printf("(%d %d)->%d\n",cur.first.x,cur.first.y,cur.second);
}
return 0;
}
演算結果
(100 200)->1
(100 1)->1
(1 200)->1
キーと値のペアが、構造に記述されたルールに従ってソートされていることがわかります。
auto cur: mp を使用すると、取得される cur はペア、つまりキーと値のペアのデータになることに注意してください。キーと値にアクセスしたい場合は、ドット演算子 (.) を使用して取得します。