Is there a convenient way to get the index of the current container entry in a C++11 foreach loop, like enumerate
in python:
for idx, obj in enumerate(container): pass
I could imagine an iterator that can also return the index or similar.
Of course I could have a counter, but often iterators don't give guarantees of the order they iterate over a container.
Luckily, there are several ways to get an index variable with foreach : Declare an integer variable before the loop, and then increase that one inside the loop with each loop cycle. Create a tuple that returns both the element's value and its index. Or swap the foreach loop with the for loop.
C# Program to Get the index of the Current Iteration of a foreach Loop Using Select() Method. The method Select() is a LINQ method. LINQ is a part of C# that is used to access different databases and data sources. The Select() method selects the value and index of the iteration of a foreach loop.
Access an element in vector using vector::at() reference at(size_type n); reference at(size_type n); It returns the reference of element at index n in vector. If index n is out of range i.e. greater then size of vector then it will throw out_of_range exception.
A good implementation of the feature you are requested can be found here:
https://github.com/ignatz/pythonic
The idea behind is, that you build a wrapper struct with a custom iterator that does the counting. Below is a very minimal exemplary implementation to illustrate the idea:
// Distributed under the terms of the GPLv2 or newer #include <iostream> #include <vector> #include <tuple> // Wrapper class template <typename T> class enumerate_impl { public: // The return value of the operator* of the iterator, this // is what you will get inside of the for loop struct item { size_t index; typename T::value_type & item; }; typedef item value_type; // Custom iterator with minimal interface struct iterator { iterator(typename T::iterator _it, size_t counter=0) : it(_it), counter(counter) {} iterator operator++() { return iterator(++it, ++counter); } bool operator!=(iterator other) { return it != other.it; } typename T::iterator::value_type item() { return *it; } value_type operator*() { return value_type{counter, *it}; } size_t index() { return counter; } private: typename T::iterator it; size_t counter; }; enumerate_impl(T & t) : container(t) {} iterator begin() { return iterator(container.begin()); } iterator end() { return iterator(container.end()); } private: T & container; }; // A templated free function allows you to create the wrapper class // conveniently template <typename T> enumerate_impl<T> enumerate(T & t) { return enumerate_impl<T>(t); } int main() { std::vector<int> data = {523, 1, 3}; for (auto x : enumerate(data)) { std::cout << x.index << ": " << x.item << std::endl; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With