std::views::enumerate — iterate with index and value.
1#include <ranges>23std::vector<std::string> names = {"Alice", "Bob", "Charlie"};45// With index6for (auto [i, name] : names | std::views::enumerate) {7 std::cout << i << ": " << name << "\n";8}9// 0: Alice10// 1: Bob11// 2: Charlie1213// Composable14auto result = names15 | std::views::enumerate16 | std::views::filter([](auto pair) {17 auto [i, name] = pair;18 return i > 0;19 });2021for (auto [i, name] : result) {22 std::cout << i << ": " << name << "\n";23}24// 1: Bob25// 2: Charlie2627// With transform28auto indexed = names29 | std::views::enumerate30 | std::views::transform([](auto pair) {31 auto [i, name] = pair;32 return std::to_string(i) + ". " + name;33 });34// "0. Alice", "1. Bob", "2. Charlie"3536// vs traditional37for (size_t i = 0; i < names.size(); i++) {38 std::cout << i << ": " << names[i] << "\n";39}
Benefits: