Динамические списки с ArrayList
Расширяйте буфер, управляемый распределителем памяти.
«Динамические списки с ArrayList» — бесплатный урок Zig Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Zig Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Zig Academy содержит 4 уроков всего.
Буфер, который может расти
Иногда размер заранее неизвестен. std.ArrayList — это динамический массив, который растёт по мере добавления элементов и использует allocator. 📈
Это обобщённый тип
ArrayList — обобщённый тип: вы один раз указываете тип элемента и получаете список именно этого типа с полной проверкой типов.
const List = std.ArrayList(i32);Создайте его с помощью init
Создайте список с помощью init, передав ему allocator, который будет использоваться при расширении. Этот allocator сохраняется у списка на протяжении всего срока его существования.
var list = std.ArrayList(i32).init(allocator);Всегда вызывайте deinit
Список владеет памятью в куче, поэтому вызову init должен соответствовать deinit, освобождающий эту память. defer сразу после init сделает очистку автоматической.
var list = std.ArrayList(i32).init(a);
defer list.deinit();Добавляйте элементы
Добавьте один элемент с помощью append. Буфер может потребовать расширения, поэтому операция может завершиться ошибкой и вызывается с try.
try list.append(7);Получайте доступ к данным
Текущие данные находятся в срезе .items. Читайте его, обращайтесь к элементам по индексу и перебирайте его так же, как любой другой срез Zig.
for (list.items) |n| std.debug.print("{}\n", .{n});Длина и вместимость
Длина — это list.items.len, то есть количество сохранённых значений. Вместимость — зарезервированное место; оно может быть больше, чтобы не расширять список слишком часто.
Заранее зарезервируйте место
Если размер примерно известен, сначала вызовите ensureTotalCapacity. Однократное резервирование избавляет от повторного выделения памяти по мере заполнения списка.
try list.ensureTotalCapacity(100);Удаляйте элементы
Удалите последний элемент с помощью pop или удалите элемент из середины по индексу. Длина списка уменьшится, но вместимость сохранится.
const last = list.pop();Передавайте владение
Вызовите toOwnedSlice, чтобы получить буфер в виде обычного среза. Список опустеет, а ответственность за освобождение памяти перейдёт к вам.
const slice = try list.toOwnedSlice();Построен на базовых операциях
ArrayList — это всего лишь alloc, копирование и free, выполненные за вас. Он показывает, насколько далеко можно продвинуться с явными allocator, используя аккуратный повторно применяемый тип. ✅
Быстрая проверка
Вспомните, что нужно сделать, когда ArrayList больше не используется.
Итоги
Вы узнали, что std.ArrayList динамически растёт с помощью allocator: используйте init, добавляйте элементы через append с try, читайте .items и всегда вызывайте deinit после завершения работы. 🎯
Часто задаваемые вопросы
Урок «Динамические списки с ArrayList» бесплатный?
Да — полный текст урока «Динамические списки с ArrayList» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Zig Academy, подпишись на CoddyKit PRO. Курс Zig Academy содержит 4 уроков всего.
Чему я научусь в уроке «Динамические списки с ArrayList»?
Расширяйте буфер, управляемый распределителем памяти. Ты практикуешь Zig Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Zig Academy?
Предыдущий опыт не требуется. Zig Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Динамические списки с ArrayList»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Zig Academy?
Да. Каждый урок Zig Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему в Zig нет скрытых выделений памяти
- Интерфейс распределителя памяти
- alloc, free, create и destroy
- Динамические списки с ArrayList