Powiel możliwe:
Find position of element in C++11 range-based for loop?Pythona jak wyliczenie pętli w C++
mam vector
i chciałbym iteracyjne go, a jednocześnie mają dostęp do indeksy dla każdego elementu (muszę przekazać zarówno element, jak i jego indeks do funkcji). Rozważałem następujące dwa rozwiązania:
std::vector<int> v = { 10, 20, 30 };
// Solution 1
for (std::vector<int>::size_type idx = 0; idx < v.size(); ++idx)
foo(v[idx], idx);
// Solution 2
for (auto it = v.begin(); it != v.end(); ++it)
foo(*it, it - v.begin());
Zastanawiam się, czy może być bardziej kompaktowe rozwiązanie. Coś podobnego do Pythona enumerate. To jest najbliższe, co mam za pomocą pętli zasięgu C++ 11, ale określenie indeksu poza pętlą w prywatnym zakresie zdecydowanie wydaje się gorszym rozwiązaniem niż 1 lub 2:
{
int idx = 0;
for (auto& elem : v)
foo(elem, idx++);
}
Czy jest jakiś sposób (być może za pomocą funkcji Boost), aby uprościć najnowszy przykład w taki sposób, aby indeks znalazł się w pętli?
Po co upraszczać proste rzeczy? :-) – Kos
Musiałbyś stworzyć funkcję/obiekt podobny do generatora, który zwraca std :: pair i użyje pierwszego i drugiego pola pary. Prawdopodobnie możesz użyć makr, aby zrobić lewę, ale nie ma przydatnego i eleganckiego sposobu użycia składni podobnej do Pythona w C++. Twoje drugie rozwiązanie to prawdopodobnie najlepsza rzecz do zrobienia. – Morwenn
@Kos Jestem prawie w porządku z rozwiązaniem 2. Po prostu ciekawy, czy jest jeszcze prostszy sposób :) – betabandido