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