Created
June 19, 2025 16:42
-
-
Save sunmeat/74becfb24bd3d64314f3bb5e5deb15dd to your computer and use it in GitHub Desktop.
приклад з уроку (клас ерей)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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