Note

Iterator-based for loops were present since C++98 but auto and initialiser lists are C++11 features.

Iterator-based for loops allow you to loop over each element in a container using iterators:

std::vector<int> cont = {0, 1, 2, 3, 4};
for (auto it = cont.begin(); it != cont.end(); ++it) {
  *it *= 2;
  std::cout << *it << "\n";
}
0
2
4
6
8

Note

it has type std::vector<int>::iterator which is cumbersome to write so it is usually written with auto.

The above is equivalent to this for loop:

for (size_t i = 0; i < cont.size(); i++) {
  auto& element = cont[i];
  element *= 2;
  std::cout << element << "\n";
}

The iteration range and increment size can be changed:

std::vector<int> cont = {0, 1, 2, 3, 4};
for (auto it = cont.begin() + 1; it < cont.end() - 1; it += 2) {
  std::cout << *it << "\n";
}
1
3

Const iterators can be used to prevent modifications during looping:

for (auto it = cont.cbegin(); it != cont.cend(); ++it) {
  std::cout << *it << "\n";
  // *it = 123;  // ERROR.
}

Iterators can traverse the container in reverse order:

std::vector<int> cont = {0, 1, 2};
for (auto it = cont.rbegin(); it != cont.rend(); ++it) {
  std::cout << *it << "\n";
}
2
1
0

Const iterators can traverse the container in reverse order:

for (auto it = cont.crbegin(); it != cont.crend(); ++it) {
  std::cout << *it << "\n";
}

References