initializer_list class
C++11 introduced class called initializer_list.
template <class Type>
class initializer_list
An initializer_list can be constructed by using brace initialization. begin(), end(), size() methods are provided to support iteration.
initializer_list<int> inputList{1, 2, 3};
for(const auto* iter = inputList.begin(); iter != inputList.end(); ++iter)
cout << *iter << " ";
Copy of an initializer_list results into new list referencing to the members of the original list.
initializer_list<int> inputList1{1, 2, 3, 4, 5};
initializer_list<int> inputList2(inputList1.begin(), inputList1.begin()+3);
initializer_list<int> inputList3(inputList1);
for(auto* iter = inputList2.begin(); iter != inputList2.end(); ++iter)
cout << *iter << " ";
cout << endl;
if(inputList2.begin() == inputList3.begin())
cout << "Members are referenced" << endl;
STL containers support for initializer lists
vector<int> inputVec = {1, 2, 3};
map<string, int> inputMap = { {"One", 1}, {"Two", 2}, {"Three" ,3} };
Using initializer lists for constructors
Class without constructor
#include <initializer_list>
#include <string>
using namespace std;
class Person {
public:
string m_name;
int m_age;
};
int main()
{
Person personA{}; // default brace initialization (with empty braces)
Person personB{ "XYZ" }; // same order as declaration in class, can skip members
Person personC{ "XYZ", 99}; // same order as declaration in class
return 0;
}
Class with constructor: Use list elements in order of parameters
class Person {
public:
Person(){}
Person(int age, string name):m_name(name), m_age(age){}
private:
string m_name;
int m_age;
};
int main()
{
Person personA{};
Person personC{ 99, "XYZ"}; // same order as parameters, cannot skip parameters
return 0;
}