Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created June 19, 2025 16:42
Show Gist options
  • Save sunmeat/74becfb24bd3d64314f3bb5e5deb15dd to your computer and use it in GitHub Desktop.
Save sunmeat/74becfb24bd3d64314f3bb5e5deb15dd to your computer and use it in GitHub Desktop.
приклад з уроку (клас ерей)
#include <iostream>
#include <windows.h>
#include <algorithm>
using namespace std;
class Array {
unsigned int capacity = 10; // при створенні масиву, він одразу для себе робить запас пам'яті на 10 елементів
int* data = new int[capacity];
unsigned int length = 0; // фактична (реальна) кількість елементів, присутніх у масиві
public:
Array() {}
void AddToBack(int value) {
if (length < capacity) // якщо виділенної зарання пам'яті ВИСТАЧАЄ для додавання чергового елемента
data[length] = value;
else { // АЛЕ ЯКЩО МІСЦЯ ВЖЕ НЕ ВИСТАЧАЄ, ТО
// треба перевиділити пам'ять
capacity *= 2; // збільшуємо запас пам'яті у 2 рази (можна і в 1.5, можна і в 1.2)
// якщо був запас 10 елементів, то стане 20
// якщо запас був 20 елементів, то стане 40, і тд
int* temp = new int[capacity]; // новий масив буде в 2 рази більше по пам'яті
// але в старому масиві все ще усього 10 елементів, тому цикл треба написати так, щоб зачепити лише старі елементі зі старого масиву
for (int i = 0; i < length; i++) {
temp[i] = data[i];
}
// в новий масив в кінець (по індексу 10) пишеться ОДИНАДЦЯТИЙ елемент
temp[length] = value;
delete[] data; // в цілях запобігання витокам пам'яті, чистимо пам'ять від старого масиву
data = temp; // переставляємо покажчик на новий масив
}
length++;
}
void AddToFront(int value) {
if (length < capacity) { // ще є вільна пам'ять під черговий елмент
// перевиділяти пам'ять на 1 елемент кожен раз - погана ідея (якщо елементів буде більше ніж 300000+ то все буде відбуватися максимально повільно)
// при тому що пам'ять вже виділена (є кепесіті), то доведеться зробити зсув для всіх існуючих елементів на 1 вправо
for (int i = length - 1; i >= 0; i--) { // зсув іде справа наліво (тому що якщо робити його зліва направо, з початку масива в кінець) то можна втратити існуючі елементи
data[i + 1] = data[i];
}
data[0] = value;
}
else { // АЛЕ ЯКЩО МІСЦЯ ВЖЕ НЕ ВИСТАЧАЄ, ТО
// треба перевиділити пам'ять
capacity *= 2; // збільшуємо запас пам'яті у 2 рази (можна і в 1.5, можна і в 1.2)
// якщо був запас 10 елементів, то стане 20
// якщо запас був 20 елементів, то стане 40, і тд
int* temp = new int[capacity]; // новий масив буде в 2 рази більше по пам'яті
// але в старому масиві все ще усього 10 елементів, тому цикл треба написати так, щоб зачепити лише старі елементі зі старого масиву
for (int i = 0; i < length; i++) {
temp[i + 1] = data[i];
}
// в новий масив в початок (по індексу 0) пишеться ОДИНАДЦЯТИЙ елемент
temp[0] = value;
delete[] data; // в цілях запобігання витокам пам'яті, чистимо пам'ять від старого масиву
data = temp; // переставляємо покажчик на новий масив
}
length++;
}
// переписати метод, тому що він не враховує кепесіті!!!
void RemoveFromBack() {
if (length == 0) {
cout << "масив пустий, видаляти НЕМА ЧОГО!\n";
return;
}
int* temp = new int[length - 1];
for (int i = 0; i < length - 1; i++)
{
temp[i] = data[i];
}
delete[] data;
data = temp;
length--;
}
// написати:
// RemoveFromFront
// Insert(100, 5)
// RemoveByIndex(4);
// RemoveByValue(10);
// Sort();
// Reverse();
// Shuffle();
// додати інформацію про ленс та кепесіті
void Print() const {
if (length == 0) {
cout << "масив пустий!\n";
}
else {
cout << "елементи масиву: ";
for (int i = 0; i < length; i++)
{
cout << data[i] << " ";
}
cout << "\n";
}
}
~Array() {
cout << "D-TOR\n";
if (data != nullptr) {
delete[] data;
}
}
// переписати!!! кепесіті не враховано!!!
Array(const Array& original) {
cout << "COPY C-TOR\n";
this->length = original.length;
this->data = new int[length];
for (int i = 0; i < length; i++)
this->data[i] = original.data[i];
}
};
int main() {
SetConsoleOutputCP(1251);
srand(time(0));
Array a;
for (int i = 0; i < 1000; i++) {
a.AddToFront(i);
}
a.Print();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment