Szukaj…


Pętla przez pojemnik

W C ++ zapętlanie przez kontener sekwencji c można wykonać za pomocą indeksów w następujący sposób:

for(size_t i = 0; i < c.size(); ++i) c[i] = 0;

Choć proste, takie zapisy podlegają częstym błędom semantycznym, takim jak zły operator porównania lub niewłaściwa zmienna indeksująca:

for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
                     ^~~~~~~~~~~~~~^

Pętle można również uzyskać dla wszystkich kontenerów używających iteratorów, z podobnymi wadami:

for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;

C ++ 11 wprowadził oparte na zakresie pętle i auto słowo kluczowe, dzięki czemu kod może stać się:

for(auto& x : c) x = 0;

Tutaj jedynymi parametrami są kontener c i zmienna x do przechowywania bieżącej wartości. Zapobiega to wcześniej wskazanym błędom semantyki.

Zgodnie ze standardem C ++ 11 podstawowa implementacja jest równoważna z:

for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
    // ...
}

W takiej implementacji wyrażenie auto begin = c.begin(), end = c.end(); siły begin i end aby być tego samego typu, podczas gdy end nigdy nie jest zwiększany ani odejmowany. Oparta na zakresie pętla działa tylko dla kontenerów zdefiniowanych przez iterator pary / iterator. Standard C ++ 17 rozluźnia to ograniczenie, zmieniając implementację na:

auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
    // ...
}

Tutaj begin i end mogą być różnych typów, o ile można je porównać pod kątem nierówności. Pozwala to na przechodzenie przez większą liczbę kontenerów, np. Kontener zdefiniowany przez iterator pary / wartownika.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow