C++11coreintermediate
Initializer Lists (C++11 Addition)
C++11 · Modern Revolution · Compiler flag: -std=c++11
Explanation
Initialize containers or objects with brace-enclosed lists.
Real-World Scenario
Initialize a vector of scores in a game.
Quick Snippet
snippet.cpp
#include <initializer_list> std::vector<int> vec{1, 2, 3};Full Example
initializer_lists.cpp
// CodeNebula - C++11 Example: std::initializer_list
// Compile: g++ -std=c++11 -Wall -Wextra -o example initializer_lists.cpp
// Demonstrates std::initializer_list for accepting brace-enclosed lists
// of values. This enables natural initialization syntax for custom containers
// and functions that process variable-length homogeneous data.
#include <iostream>
#include <initializer_list>
#include <vector>
#include <string>
#include <algorithm>
#include <numeric>
// Real-world scenario: a custom container accepting initializer_list
class IntSet {
std::vector<int> data_;
public:
IntSet(std::initializer_list<int> init) : data_(init)
{
std::sort(data_.begin(), data_.end());
auto last = std::unique(data_.begin(), data_.end());
data_.erase(last, data_.end());
}
bool contains(int val) const
{
return std::binary_search(data_.begin(), data_.end(), val);
}
void print() const
{
std::cout << "{";
for (std::size_t i = 0; i < data_.size(); ++i) {
if (i > 0) std::cout << ", ";
std::cout << data_[i];
}
std::cout << "}";
}
std::size_t size() const { return data_.size(); }
};
// Function accepting initializer_list
double average(std::initializer_list<double> values)
{
if (values.size() == 0) return 0.0;
double sum = std::accumulate(values.begin(), values.end(), 0.0);
return sum / values.size();
}
// Overloaded function: initializer_list vs single value
void show(int val)
{
std::cout << " show(int): " << val << std::endl;
}
void show(std::initializer_list<int> vals)
{
std::cout << " show(init_list): ";
for (auto v : vals) std::cout << v << " ";
std::cout << std::endl;
}
int main()
{
// ------------------------------------------------------------------
// 1. Standard library with initializer_list
// ------------------------------------------------------------------
std::vector<int> nums = {5, 3, 1, 4, 2};
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
std::cout << "=== Standard library ===" << std::endl;
std::cout << " nums: ";
for (int n : nums) std::cout << n << " ";
std::cout << std::endl;
std::cout << " names: ";
for (const auto& s : names) std::cout << s << " ";
std::cout << std::endl << std::endl;
// ------------------------------------------------------------------
// 2. Custom class with initializer_list constructor
// ------------------------------------------------------------------
IntSet evens = {2, 4, 6, 8, 4, 6, 2}; // duplicates removed
std::cout << "=== Custom IntSet ===" << std::endl;
std::cout << " evens: ";
evens.print();
std::cout << std::endl;
std::cout << " size: " << evens.size() << " (duplicates removed)" << std::endl;
std::cout << " contains(4): " << (evens.contains(4) ? "yes" : "no") << std::endl;
std::cout << " contains(5): " << (evens.contains(5) ? "yes" : "no") << std::endl;
std::cout << std::endl;
// ------------------------------------------------------------------
// 3. Functions accepting initializer_list
// ------------------------------------------------------------------
double avg = average({10.0, 20.0, 30.0, 40.0});
std::cout << "=== Function with initializer_list ===" << std::endl;
std::cout << " average({10,20,30,40}): " << avg << std::endl;
std::cout << std::endl;
// ------------------------------------------------------------------
// 4. Iterating over initializer_list properties
// ------------------------------------------------------------------
auto il = {1, 2, 3, 4, 5};
std::cout << "=== Initializer_list properties ===" << std::endl;
std::cout << " size: " << il.size() << std::endl;
std::cout << " elements: ";
for (auto it = il.begin(); it != il.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl << std::endl;
// ------------------------------------------------------------------
// 5. Overload resolution with initializer_list
// ------------------------------------------------------------------
std::cout << "=== Overload resolution ===" << std::endl;
show(42); // calls show(int)
show({1, 2, 3}); // calls show(initializer_list<int>)
return 0;
}
/*
Expected output:
=== Standard library ===
nums: 5 3 1 4 2
names: Alice Bob Charlie
=== Custom IntSet ===
evens: {2, 4, 6, 8}
size: 4 (duplicates removed)
contains(4): yes
contains(5): no
=== Function with initializer_list ===
average({10,20,30,40}): 25
=== Initializer_list properties ===
size: 5
elements: 1 2 3 4 5
=== Overload resolution ===
show(int): 42
show(init_list): 1 2 3
*/
Run command
g++ -std=c++11 -Wall -Wextra -o example initializer_lists.cpp