<initializer_list>
The <initializer_list>
header is part of the C++ Standard Library and provides support for initializer list constructors. It was introduced in C++11 to allow functions and constructors to take a list of values as an argument in a flexible and efficient manner. This feature is particularly useful for container classes and functions that need to work with an arbitrary number of values of the same type.
<initializer_list>
headerconst T
#include <iostream>
#include <initializer_list>
#include <vector>
template<typename T>
class MyContainer {
private:
std::vector<T> data;
public:
MyContainer(std::initializer_list<T> list) : data(list) {
std::cout << "Constructed with " << list.size() << " elements." << std::endl;
}
void print() const {
for (const auto& item : data) {
std::cout << item << " ";
}
std::cout << std::endl;
}
};
int main() {
MyContainer<int> c1 = {1, 2, 3, 4, 5};
c1.print();
MyContainer<std::string> c2 = {"Hello", "World", "!"};
c2.print();
return 0;
}
MyContainer
has a constructor that takes an std::initializer_list<T>
.#include <iostream>
#include <initializer_list>
#include <numeric>
double average(std::initializer_list<double> list) {
if (list.size() == 0) return 0;
return std::accumulate(list.begin(), list.end(), 0.0) / list.size();
}
void printValues(std::initializer_list<int> list) {
for (int value : list) {
std::cout << value << " ";
}
std::cout << std::endl;
}
int main() {
std::cout << "Average: " << average({1.0, 2.0, 3.0, 4.0, 5.0}) << std::endl;
std::cout << "Average: " << average({10.5, 20.5, 30.5}) << std::endl;
printValues({1, 2, 3, 4, 5});
printValues({100, 200, 300});
return 0;
}
average
function calculates the average of a list of doubles.printValues
demonstrates how to iterate over an initializer list.#include <iostream>
#include <initializer_list>
#include <vector>
#include <string>
class Team {
private:
std::string name;
std::vector<std::string> members;
public:
Team(const std::string& teamName) : name(teamName) {
std::cout << "Team created with name only" << std::endl;
}
Team(const std::string& teamName, std::initializer_list<std::string> memberList)
: name(teamName), members(memberList) {
std::cout << "Team created with name and member list" << std::endl;
}
void display() const {
std::cout << "Team: " << name << std::endl;
std::cout << "Members: ";
for (const auto& member : members) {
std::cout << member << " ";
}
std::cout << std::endl;
}
};
int main() {
Team team1("Avengers");
team1.display();
Team team2("Justice League", {"Superman", "Batman", "Wonder Woman"});
team2.display();
return 0;
}
Team
class has two constructors: one taking just a name, and another taking a name and an initializer list of members.Team
object.#include <iostream>
#include <initializer_list>
#include <vector>
#include <set>
#include <map>
template<typename T>
void printContainer(const T& container) {
for (const auto& item : container) {
std::cout << item << " ";
}
std::cout << std::endl;
}
int main() {
// Vector
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << "Vector: ";
printContainer(vec);
// Set
std::set<char> charSet = {'a', 'b', 'c', 'd', 'e'};
std::cout << "Set: ";
printContainer(charSet);
// Map
std::map<std::string, int> ageMap = {
{"Alice", 25},
{"Bob", 30},
{"Charlie", 35}
};
std::cout << "Map: " << std::endl;
for (const auto& pair : ageMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
vector
, set
, and map
support initialization using initializer lists.Performance: initializer_list
is a lightweight object, making it efficient to pass by value.
Const Elements: The elements in an initializer_list
are always const.
Lifetime: The underlying array of an initializer_list
is temporary, so don't store or return an initializer_list
.
Order: The order of elements in an initializer_list
is preserved.
Empty Lists: It's possible to pass an empty initializer list {}
.
The <initializer_list>
header in C++ provides a powerful mechanism for working with list-initialized data:
Key points to remember:
- Include <initializer_list>
to use this feature.
- Elements in an initializer_list
are always const.
- It's lightweight and designed for efficient passing by value.
- Widely supported by standard containers and algorithms.
Best practices:
- Use initializer_list
for functions that logically operate on a list of values.
- Provide initializer_list
constructors for your own container-like classes.
- Be aware of the const nature of initializer_list
elements.
- Don't store or return initializer_list
objects, as their lifetime is temporary.
The <initializer_list>
header is a valuable tool in modern C++ programming, enabling more flexible and expressive ways of working with lists of values, particularly in the context of object construction and function arguments.