Consider a container like so:

std::vector<int> cont = {0, 1, 2, 3};

Range-based for loops allow you to loop over each element in a container without writing an index or iterator:

for (auto element : cont) {
    std::cout << element << "\n";
}

The above is equivalent to this for loop:

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

And you can also get elements by reference if you want mutation:

for (auto& element : cont) {
    element *= 2;
}

You can get elements as a const if you do not need mutation:

for (auto const& element : cont) {
    std::cout << element << "\n";
}

References