Initializer lists, or if you prefer, initialiser lists, are a great addition of C++ 11, which allows you to 1) initialize your list-like classes and 2) uniform the initialisation of such objects comparing to what you can do with the built-in types.
Let us demonstrate it on the following example, which uses a simple array of integers:
#include <iostream> int main() { int a[] = {1, 3, 5, 7}; for (auto x : a) std::cout << x << "\n"; }
You could not easily change int[]
to std::vector<int>
earlier, as the compiler would not accept such initializing values.
Since C++ 11, you can:
#include <iostream> #include <vector> int main() { std::vector<int> v {1, 3, 5, 7}; for (auto x : v) std::cout << x << "\n"; }
Alternatively, you can add the =
sign:
std::vector<int> v = {1, 3, 5, 7};
Initializer lists can be also used in user-defined types. All you need is to add a constructor that accepts std::initializer_list
. This is demonstrated in the next example, where a wrapper is created around the standard vector.
#include <iostream> #include <initializer_list> #include <vector> struct data { std::vector<int> v; data(std::initializer_list<int> lst) : v(lst) {} }; int main() { data a {1, 3, 5, 7}; // data a = {1, 3, 5, 7}; for (auto x : a.v) std::cout << x << "\n"; }
The only constructor here simply fills the v
member with the values from the initializer list.