Tego elementu dotychczas najbardziej brakowało mi w C++. No i wreszcie – jest :)
Stary sposób
Dotychczas iterowanie po zbiorze wymagało fatalnie IMO rozwlekłego zapisu z jawnym iteratorem:
vector<string> strings = { "ala", "ma", "kota" }; for (vector::iterator it = strings.begin(); it != strings.end(); ++it) { cout << *it << endl; }
Na szczęście, C++11 wprowadza….
Nowy sposób
, czyli szybko, ładnie i wygodnie iterujemy po zbiorze z wykorzystaniem konstrukcji ala “foreach”:
vector<string> strings = { "ala", "ma", "kota" }; for (string & s : strings) { cout << s << endl; }
Nowy sposób iterowania jest dostępny dla kontenerów STL, zwykłych tablic typu int liczby[] = {1, 2, 3, 4, 5} i wszelkich obiektów, które zapewniają iteratorowy interfejs (metody begin oraz end).
Warto jeszcze wiedzieć, że
- składnia for (string & s : strings), czyli z referencją, pozwala na modyfikację elementów wewnątrz zbioru
- składnia for (string s : strings), czyli bez referencji, pozwala jedynie na odczyt elementów zbioru
- ogólnie, pętla “foreach” ukrywa iterator, więc nie można w niej skorzystać z funkcji erase do usuwania elementów zbioru
That’s all, folks!
Btw. to, że tak wygodnie inicjalizujemy sobie wektor w jednej linijce, to też zasługa C++11 – tzw. lista inicjalizatora. O tym ficzerze napiszę wkrótce :)