最新のC++では、各要素の値のみが必要な場合に文字列やベクトルなどのシーケンシャルコレクションを反復処理するためのイディオムは短くエレガントです。
for (auto x: xs)
インデックスも必要な場合は、少しエレガントではありません。
for (size_t i = 0; i != xs.size() ++i)
...私がまだ追いついていない最近の開発がない限り。C ++ 11には後者を行うための好ましい方法がありますか、それとも上記はそれでもうまくいきますか?
Range-Based for loops
Range-Based for Loops
範囲の概念をサポートするすべての型に有効です。与えられた型 T のオブジェクト objbegin(obj)
はend(obj)
有効です。内容:
推奨される慣用的な方法は、単純な for ループです。
別の方法として、整数範囲を使用する方法があります。
template<typename C>
auto container_index(C const& container) -> decltype(boost::irange(0, container.size())) {
return boost::irange(0, container.size());
}
for(auto x : container_index(xs))
または反復関数:
template<typename F>
void index_iterate(std::size_t size, F func) {
for(std::size_t i = 0; i != size; ++i) {
func(i);
}
}
index_iterate(container.size(), [&](std::size_t i){ /* ... */ });
ただし、可能な限り単純なループを使用してください。それは私の意見では優れています。
次の 2 つの方法を組み合わせることができます。
int i = 0;
for ( auto x : v ) {
// do smth with x or v[i] or i
i++;
}