Я открываю цикл на основе С++ 11 и уже люблю его. Это заставляет вас экономить много времени при кодировании.
Тем не менее, я привык писать несколько циклов с дополнительными инструкциями/условиями, и мне интересно, что это может быть достигнуто при использовании цикла на основе С++ 11:
1. Дополнительная инкрементация
std::vector<int> v = { 1, 2, 3, 4, 5 };
size_t index = 0;
for ( std::vector<int>::const_iterator iter = v.begin(); iter != v.end(); ++iter, ++index )
{
std::cout << "v at index " << index << " is " << *iter;
}
Может стать:
size_t index = 0;
for ( int val : v )
{
std::cout << "v at index " << index << " is " << *iter;
++index;
}
Однако приращение index
в цикле for
лучше, потому что гарантировано (увеличивается, даже если цикл for
имеет continue
), например)
Есть ли способ переместить ++index
внутри оператора for
?
2. Динамический индекс динамической конверсии
std::vector<int> v = { 1, 2, 3, 4, 5 };
for ( std::vector<int>::const_iterator iter = v.begin(); iter != v.end(); ++iter )
{
std::cout << "v at index " << ( iter - v.begin() ) << " is " << *iter;
}
Можно ли добиться чего-то подобного с помощью цикла С++ 11 с диапазоном? Есть ли способ узнать, сколько итераций было сделано до сих пор?
3. Дополнительное условие выхода
Я часто использую это в коде, где запрет запрещен как направляющая для кодирования:
std::vector<int> v = { 1, 2, 3, 4, 5 };
bool continueLoop = true;
for ( std::vector<int>::const_iterator iter = v.begin(); iter != v.end() && continueLoop; ++iter )
{
std::cout << "v value is " << *iter;
if ( *iter == 4 )
continueLoop = false;
}
Может ли быть что-то подобное достигнуто с помощью цикла на основе С++ 11 (выход из строя без использования перерыва)?