Page List

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を使用しています。そして月日の順でソートをして表示します。
  1. int main() {  
  2. vector<pair<intint> >birthday(20);  
  3.   
  4. REP(i, 20)  
  5.  birthday[i] = MP(rand() % 12 + 1, rand() % 30 + 1);  
  6.   
  7. SORT(birthday);  
  8.   
  9. REP(i, 20)  
  10.  printf("%02d/%02d is My Birthday.\n", birthday[i].first, birthday[i].second);  
  11. return 0;  
  12. }  
いやー、これはかなり便利だねー。
更に、性と名をpairに格納することも可能。所謂”名前順”ってやつでソートしてみましょう!


  1. int main() {  
  2. vector<pair<string, string> >name(10);  
  3. name[0] = MP("Tanaka""Ai");  
  4. name[1] = MP("Yamada""Taro");  
  5. name[2] = MP("Yamada""Hanako");  
  6. name[3] = MP("Okada""Yusuke");  
  7. name[4] = MP("Yamaguchi""Satoshi");  
  8. name[5] = MP("Suzuki""Ichiro");  
  9. name[6] = MP("Suzuki""Jiro");  
  10. name[7] = MP("Suzuki""Saburo");  
  11. name[8] = MP("Suzuki""Shiro");  
  12. name[9] = MP("Oda""Nobuo");  
  13.   
  14. SORT(name);  
  15.   
  16. EACH(itr, name)  
  17.   cout << "I'm " << itr->first << " " << itr->second << endl;  
  18. return 0;  
  19. }  
何か気付きましたか?
そうです、鈴木が多いです。
じゃなくて、stringを使っています。const char*ではダメです。
なぜなら、比較演算子が定義されていないからです。(const char*の場合はstrcmp()で比較しますよね!)

0 件のコメント:

コメントを投稿