C++
Porównania klasycznych przykładów C ++ rozwiązanych za pomocą C ++ vs C ++ 11 vs C ++ 14 vs C ++ 17
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.