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);
}
→auto にしておけばコンパイラが型を導出してくれる
set<int> s;
for(auto it = s.begin(); it != s.end(); ++it) {
if(*it == 5) it = s.erase(it);
}
6. Range-based for
? 例えば単純に set の要素についてループする場合、
C++03では色々と面倒
std::set<int> s;
for(std::set<int>::iterator it = s.begin(); it != s.end(); ++it)
std::cout << *it << std::endl;
auto でもやっぱり微妙
std::set<int> s;
for(auto it = s.begin(); it != s.end(); ++it)
std::cout << *it << std::endl;
Range-based for ループですっきり
set<int> s;
for(auto v : s)
std::cout << v << std::endl;
コンテナ s の各要素を v に割り当ててループ
15. initializer_list
? 応用編
?min / max
min / max は 2 引数だったので複数値の min / max
をとりたい場合は多段で適用する必要があった
int minimum = std::min(std::min(a, b), std::min(c, d));
→initializer_list を受けられるようになったので一発で OK
int minimum = std::min({a, b, c, d});
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;
}
→Range-based for と initializer_list の組み合わせで
こんな簡潔に
for(int i : { 1, 2, 3, 5, 8, 13, 21} ) {
std::cout << i << std::endl;
}