Реализация собственного контейнера с помощью initializer_list
Initializer_list - это специальный класс шаблона, который представляет собой список инициализации, то есть набор значений, заключенных в фигурные скобки. Например, {1, 2, 3} - это список инициализации, который содержит три целых числа. Initializer_list позволяет передавать такие списки в качестве аргументов функций или конструкторов, а также использовать их для инициализации объектов различных типов, включая собственные контейнеры1.
Для того, чтобы реализовать собственный контейнер с помощью initializer_list, нужно выполнить следующие шаги:
Определить класс контейнера, который хранит элементы в некоторой структуре данных, например, в массиве, векторе или списке. Класс контейнера должен иметь методы для доступа, добавления и удаления элементов, а также другие операции, которые необходимы для работы с контейнером.
Определить конструктор контейнера, который принимает в качестве параметра объект типа initializer_list. В теле конструктора нужно скопировать элементы из initializer_list в структуру данных контейнера, используя методы begin() и end() для получения итераторов на начало и конец списка инициализации.
Определить оператор присваивания контейнера, который также принимает в качестве параметра объект типа initializer_list. В теле оператора нужно очистить старые данные контейнера и скопировать элементы из initializer_list в структуру данных контейнера, аналогично конструктору.
Вот пример реализации собственного контейнера, который хранит элементы в векторе:
#include <iostream>
#include <vector>
#include <initializer_list>
// Класс контейнера
template <typename T>
class MyContainer {
private:
std::vector<T> data; // Структура данных для хранения элементов
public:
// Конструктор по умолчанию
MyContainer() {}
// Конструктор, принимающий список инициализации
MyContainer(std::initializer_list<T> il) {
// Копирование элементов из списка инициализации в вектор
for (auto it = il.begin(); it != il.end(); ++it) {
data.push_back(*it);
}
}
// Оператор присваивания, принимающий список инициализации
MyContainer& operator=(std::initializer_list<T> il) {
// Очистка старых данных
data.clear();
// Копирование элементов из списка инициализации в вектор
for (auto it = il.begin(); it != il.end(); ++it) {
data.push_back(*it);
}
return *this;
}
// Метод для вывода элементов контейнера на экран
void print() const {
for (const auto& elem : data) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
};
int main() {
// Создание объекта контейнера с помощью списка инициализации
MyContainer<int> c1 = {1, 2, 3, 4, 5};
c1.print(); // 1 2 3 4 5
// Присваивание контейнеру нового списка инициализации
c1 = {6, 7, 8, 9, 10};
c1.print(); // 6 7 8 9 10
return 0;
}
Интересные факты и фичи языков программирования у нас в канале, заходи :)























