Skip to content

amanzhola/cpp-simple-vector2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 

Repository files navigation

C++ • STL Internals • Move Semantics • Memory Layout • Vector Implementation

SimpleVector — семантика перемещения (Move Semantics)

Учебный проект, демонстрирующий реализацию собственного вектора (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) 

🧠 Ключевые идеи

1️⃣ ArrayPtr

  • RAII-владение T[]
  • ❌ копирование запрещено (защита от double delete)
  • ✅ перемещение O(1)
  • используется для строгой гарантии исключений
  • безопасное перевыделение памяти в контейнере

2️⃣ SimpleVector

Собственная реализация вектора с поддержкой:

  • 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).

▶️ Сборка и запуск

Linux / WSL / MinGW

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 больше не чёрный ящик 😉

About

Educational C++ project implementing a custom vector with move semantics, exception safety guarantees, and memory layout visualization.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages