3. C++0x とは 国際標準化機構 ISO で規格化されている C++ 規格 (ISO 14882) の次期版仮称 200x 年代に発行予定だったが間に合わなかったため 0x は 16 進プレフィクスということに http://www2.research.att.com/~bs/C++0xFAQ.html 先頃 Final Draft が承認され規格発行を待つ状態であり正式名称 14882:2011 となる予定 小修正だった 14882:2003 とは異なり、言語自体また標準ライブラリに非常に大きな変更が加えられている 本稿では競技プログラミングから見た C++0x の利点について紹介する Codeforces で gcc 4.6 での C++0x 機能が使えるのでそれを基準として説明する
4. 目次 auto Range-based for Lambda tuple initializer_list unordered_map / unordered_set 新規アルゴリズム (iota, all_of) ちょっとした改善 (map::at) 対応微妙 (regex / emplace)
5. auto 例えば set の要素についてループする場合、 Iterator の型を書くのが面倒 set<int> s; for( set<int>::iterator it = s.begin(); it != s.end(); ++it) { if(*it == 5) it = s.erase(it); } set<int> s; for( auto it = s.begin(); it != s.end(); ++it) { if(*it == 5) it = s.erase(it); } -> auto にしておけばコンパイラが型を導出してくれる
6. Range-based for 例えば単純に set の要素についてループする場合、 C++03 では色々と面倒 Range-based for ループですっきり コンテナ s の各要素を v に割り当ててループ std::set<int> s; for( std::set<int>::iterator it = s.begin(); it != s.end(); ++it ) std::cout << *it << std::endl; std::set<int> s; for( auto it = s.begin(); it != s.end(); ++it ) std::cout << *it << std::endl; auto でもやっぱり微妙 set<int> s; for( auto v : s ) std::cout << v << std::endl;
7. lambda (無名関数オブジェクト) <algorithm> は便利だけど関数オブジェクト書くのが面倒でループで書いてしまう // 関数オブジェクト struct check2nd { check2nd(const int &n) : n(n) {} bool operator()(const std::pair<int, int> &p) { return p.second == n; } const int &n; }; std::vector<std::pair<int, int>> v; int k; return std::count_if(v.begin(), v.end(), check2nd(k)); // 自前ループ std::vector<std::pair<int, int>> v; int k; int result = 0; for(int i=0;i<v.size(); ++i) if(v[i].second == k) ++result; return result;
15. initializer_list 応用編 min / max int minimum = std::min(std::min(a, b), std::min(c, d)); int minimum = std::min({a, b, c, d}); min / max は 2 引数だったので複数値の min / max をとりたい場合は多段で適用する必要があった -> initializer_list を受けられるようになったので一発で OK
16. initializer_list 応用編 固定値のリストでループ int init[] = { 1, 2, 3, 5, 8, 13, 21 }; for(std::size_t i = 0; i < sizeof(init) / sizeof(init[0]); ++i) { std::cout << init[i] << std::endl; } for(int i : { 1, 2, 3, 5, 8, 13, 21} ) { std::cout << i << std::endl; } 固定値を持つ配列を用意して添え字でループ -> Range-based for と initializer_list の組み合わせで こんな簡潔に