31 marca 2013

std::initializer_list

std::initializer_list<T> to nowa struktura danych, która rozbudowuje bibliotekę standardową. Wszystkie elementy, które się w niej znajdują nie mogą być modyfikowane (coś jak const T, dla wektora). Trochę zdziwił mnie fakt, że w szablonie tym zabrakło metod cbegin/cend, zwracających const_iterator (za to są begin/end, które to robią). Z pomocą jak zwykle przyszedł stackoverflow. W tej chwili trudno mi znaleźć dla tego zastosowanie i nie wiem też, jak to jest wykorzystywane przez inne ficzery, w nowym standardzie.

Trochę więcej informacji: http://en.cppreference.com/w/cpp/utility/initializer_list

std::initializer_list<T> świetnie nadaje się inicjalizowania kontenerów (np. vector), co do tej pory było dość problematyczne. Należy jednak zwrócić uwagę, na problemy z istniejącą składnią (wsteczną kompatybilnością). vector inaczej się zachowa, gdy do konstrukcji użyjemy konstruktora z nawiasami klamerkowymi w celu wstawienia dwóch elementów, a inaczej nawiasów okrągłych (stary konstruktor, powieli N razy drugi parametr).
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec1(5, 2);
    for (const auto& v : vec1)
        cout << v << " ";
    cout << endl;

    vector<int> vec2{5, 2};
    for (const auto& v : vec2)
        cout << v << " ";
    cout << endl;
}
Wynik:
2 2 2 2 2 
5 2

Brak komentarzy:

Prześlij komentarz