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;
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