Search on the blog

2010年9月14日火曜日

知ってると便利なSTL(2) pair

intとintのペアを扱いたいとき、ついつい自分でクラスを作ってしまっていた。
何が面倒かというとソート。いちいちoperatorを定義してあげないとsort()が使えない。

最近、pairというSTLが便利だということを知った。
2つの型のペアを格納でき、さらに比較演算子が定義されているため、sort()が使える。かなり便利。
比較演算では、pairの第一要素の比較結果が返される。第一要素が同じ値だった場合は、第二要素の比較結果が返される。
唯一不便そうな、make_pairも下のようなマクロを定義してやれば楽々!!
#define MP make_pair

まー、いつもの如くコードで説明します。誕生日を格納するために、pairを使用しています。そして月日の順でソートをして表示します。

int main() {
vector<pair<int, int> >birthday(20);

REP(i, 20)
birthday[i] = MP(rand() % 12 + 1, rand() % 30 + 1);

SORT(birthday);

REP(i, 20)
printf("%02d/%02d is My Birthday.\n", birthday[i].first, birthday[i].second);
return 0;
}
いやー、これはかなり便利だねー。
更に、性と名をpairに格納することも可能。所謂”名前順”ってやつでソートしてみましょう!



int main() {
vector<pair<string, string> >name(10);
name[0] = MP("Tanaka", "Ai");
name[1] = MP("Yamada", "Taro");
name[2] = MP("Yamada", "Hanako");
name[3] = MP("Okada", "Yusuke");
name[4] = MP("Yamaguchi", "Satoshi");
name[5] = MP("Suzuki", "Ichiro");
name[6] = MP("Suzuki", "Jiro");
name[7] = MP("Suzuki", "Saburo");
name[8] = MP("Suzuki", "Shiro");
name[9] = MP("Oda", "Nobuo");

SORT(name);

EACH(itr, name)
cout << "I'm " << itr->first << " " << itr->second << endl;
return 0;
}
何か気付きましたか?
そうです、鈴木が多いです。
じゃなくて、stringを使っています。const char*ではダメです。
なぜなら、比較演算子が定義されていないからです。(const char*の場合はstrcmp()で比較しますよね!)

0 件のコメント:

コメントを投稿