Znaleźć pozycję elementu w zakresie C ++ 11 na podstawie pętli for?
Załóżmy, że mam następujący kod:
vector<int> list;
for(auto& elem:list) {
int i = elem;
}
Czy mogę znaleźć pozycję
elemw wektorze bez utrzymywania oddzielnego iteratora?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
11 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Sztuczka polega na użyciu kompozycji: zamiast iterować bezpośrednio po kontenerze, „spakuj” go z indeksem wzdłuż ścieżki.
Specjalistyczny kod błyskawicy:
I użyj go:
Możesz to zobaczyć w
ideone
http://ideone.com/rAcaZ
chociaż nie obsługuje pętli for-range, więc jest mniej ładny.
EDIT
:
Właśnie sobie przypomniałem, że powinienem częściej sprawdzać Boost.Range. Niestety nie ma zakresu , ale znalazłem perl: http://www.boost.org/doc/libs/ ... ml... Jednak pobranie indeksu wymaga dostępu do iteratora. Wstyd: x
W przeciwnym razie z http://www.boost.org/doc/libs/ ... .html
i ogólnie Jestem pewien, że można by zrobić coś interesującego ...
W idealnym świecie wyobrażam sobie:
Z automatycznym tworzeniem widoku jako zakresu krotek linków i tworzącym po prostu „fałszywy” zakres zaczynający się od i po prostu odlicza do nieskończoności (lub cóż, maksimum tego typu ...).
Anonimowy użytkownik
Potwierdzenie od:
Jednak w twoim przypadku można to obliczyć za pomocą arytmetyki wskaźników, ponieważ przechowuje swoje elementy sekwencyjnie (*)
Jest to jednak zdecydowanie zła praktyka, ponieważ zaciemnia & amp; kod, czyni go bardziej delikatnym (łatwo się psuje, jeśli ktoś zmieni typ kontenera, przeładuje operator lub zastępuje 'auto & amp ; 'z' auto '.)
UWAGA: Przyleganie jest gwarantowane dla wektora w standardzie C ++ 03 oraz dla tablicy i ciągu znaków w standardzie C ++ 11.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
boost::adaptors::indexed
https://www.boost.org/doc/libs ... .html
:
Możesz tego spróbować
https://ideone.com/JDjsTB
Działa w podobny sposób, jak wspomniane „rozwiązanie idealnego świata”, ma ładną składnię i jest zwięzłe. Zauważ, że typ w tym przypadku jest czymś w rodzaju , więc obsługuje linkowanie tam i kopiowanie nie zostało wykonane. Jest nawet niesamowicie skuteczny:
https://godbolt.org/g/e4LMnJ
https://godbolt.org/g/e4LMnJ
(kod jest równoważny przechowywaniu własnej zmiennej licznika, która jest tak dobra, jak to tylko możliwe)
Aby uzyskać kompletność, rozważ alternatywy:
Lub używając ciągłej właściwości wektorowej:
Pierwsza generuje ten sam kod co wersja adaptera boost (optymalna), a druga jest o 1 instrukcję dłuższa:
https://godbolt.org/g/nEG8f9
https://godbolt.org/g/nEG8f9
Uwaga: jeśli chcesz tylko wiedzieć, czy masz ostatni element, którego możesz użyć:
Działa to dla każdego standardowego kontenera, ale należy użyć / (tak samo jak powyżej), ale nadal jest zalecane. W zależności od danych wejściowych może to być również dość szybkie (zwłaszcza gdy kompilator zna rozmiar twojego wektora)
Zamień na , aby był bezpieczny dla kodu ogólnego.
Anonimowy użytkownik
Potwierdzenie od:
Działa z clang 3.4 i gcc 4.9 (nie 4.8); w obu przypadkach musisz ustawić . Powodem, dla którego potrzebujesz C ++ 14, są parametry w funkcji lambda.
Anonimowy użytkownik
Potwierdzenie od:
Nie sądzę, że istnieje czystsze/prostsze rozwiązanie dla zakresu opartego na pętli. Ale tak naprawdę, dlaczego nie użyć standardu dla (;;)? To prawdopodobnie uczyniłoby twoje intencje i kod jaśniejszym.
Anonimowy użytkownik
Potwierdzenie od:
gdzie będzie wymaganym indeksem.
Wykorzystuje to fakt, że
Wektory C ++ są zawsze sąsiadujące
https://coderoad.ru/7609169/
.
Anonimowy użytkownik
Potwierdzenie od:
EDIT:
na przykład, to drukuje kontener, w którym brakuje separatora w ostatnim elemencie. Działa dla większości kontenerów, jakie mogę sobie wyobrazić (w tym tablic), (demo online
http://coliru.stacked-crooked. ... 87f91
http://coliru.stacked-crooked. ... 87f91
):
Anonimowy użytkownik
Potwierdzenie od:
GitHub
https://github.com/therocode/e ... e.hpp
Post na blogu
https://blog.therocode.net/201 ... index
Bardzo przyjemny w użyciu:
Anonimowy użytkownik
Potwierdzenie od:
Wynik:
Anonimowy użytkownik
Potwierdzenie od:
zmienna indeksu lokalna dla pętli, możesz użyć lambdy ze zmienną mutowalną.:
<pre class="lang-cpp prettyprint-override">