C++ • STL Internals • Move Semantics • Memory Layout • Vector Implementation
Учебный проект, демонстрирующий реализацию собственного вектора (SimpleVector) с поддержкой move-семантики, строгих и базовых гарантий исключений и наглядной визуализацией работы памяти.
Проект создан для глубокого понимания:
- как устроен
std::vectorвнутри, - зачем нужны
move ctor / move assign, - когда происходит
realloc, - как элементы физически «переезжают» в памяти при
Insert/Erase.
. ├── README.md # README.md ├── simple_vector/ │ ├── array_ptr.h # RAII-обёртка над динамическим массивом │ ├── simple_vector.h # Реализация SimpleVector │ ├── tests_move_visual.h # Визуальные демо move-семантики │ ├── main_visual.cpp # Интерактивный запуск визуальных демо │ └── main.cpp # Обычный запуск тестов (assert-based) └── docs/ ├── visual_demo_E_explained.md # Подробный разбор режима E └── windows_run_log.txt # Полный вывод запуска на Windows (UTF-8, chcp 65001) - RAII-владение
T[] - ❌ копирование запрещено (защита от double delete)
- ✅ перемещение O(1)
- используется для строгой гарантии исключений
- безопасное перевыделение памяти в контейнере
Собственная реализация вектора с поддержкой:
- move-конструктора и move-оператора присваивания
- работы с некопируемыми (move-only) типами
PushBack,Insert,Erase,Resize,Reserve- поведения, максимально близкого к
std::vector
Интерактивный визуализатор показывает реальное поведение памяти.
| Режим | Что демонстрирует |
|---|---|
| A | move ctor / assign — буфер переезжает (O(1)) |
| B | realloc — смена адреса буфера при росте capacity |
| C | move-only элементы (TraceX), видны вызовы move |
| D | все режимы подряд |
| E | 🔥 адрес каждого элемента &v[i] до/после Insert/Erase |
После каждого прогона можно:
- выбрать другой режим,
- либо выйти (
Q/X).
g++ -std=c++17 -O2 -Wall -Wextra main_visual.cpp -o visual Запуск
./visual или сразу с указанием режима:
./visual A ./visual B ./visual C ./visual D ./visual E 🪟 Windows (UTF-8 + эмодзи) Чтобы русский текст и эмодзи корректно отображались в консоли:
chcp 65001 g++ -std=c++17 -O2 -Wall -Wextra main_visual.cpp -o visual visual 📌 Пример вывода (режим E)
Введите A/B/C/D/E: E 🧪 E) SimpleVector — SLOTS: адрес каждого &v[i] до/после Insert/Erase 📦 v(initial) | size=6 cap=8 | [ 0 1 2 3 4 5 ] 🧠 Insert idx=2 value=99 ✅ REALLOC не было → адреса слотов те же, значения сдвинулись 🧠 Erase idx=1 ✅ container valid ➡️ Подробный построчный разбор с реальными адресами памяти смотри в файле:
docs/visual_demo_E_explained.md 🎓 Назначение проекта
Проект подходит для:
изучения move-семантики C++,
понимания устройства STL-контейнеров,
подготовки к собеседованиям,
обучения наглядно, «по адресам и памяти».
🏁 Итог
Этот репозиторий — не просто код, а интерактивный учебный стенд, позволяющий увидеть, что именно происходит в памяти при работе вектора.
Если понимаешь этот проект —> std::vector больше не чёрный ящик 😉