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 :)

Related Posts: