-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArray.h
159 lines (137 loc) · 6.42 KB
/
Array.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#ifndef ARRAY_H
#define ARRAY_H
#include <string>
#include <fstream>
#include <iostream>
#include <stdexcept>
using namespace std;
template <typename T>
class Array {
private:
T* data; // Указатель на массив
int size; // Текущий размер массива
int capacity; // Вместимость массива
void resize(); // Метод для изменения размера массива
public:
Array(); // Конструктор
~Array(); // Деструктор
void mpush(const T& element); // Добавление элемента в конец
void minsert(int index, const T& element); // Добавление элемента по индексу
void mdel(int index); // Удаление элемента по индексу
T mprint(int index) const; // Получение элемента по индексу
void mreplace(int index, const T& element); // Замена элемента по индексу
int mlength() const; // Узнать длину массива
void mget() const; // Чтение массива
void loadFromFile(const std::string& filename); // Считывание массива из файла
void saveToFile(const std::string& filename) const; // Запись массива в файл
};
// Конструктор класса Array
template <typename T>
Array<T>::Array() : size(0), capacity(10) {
data = new T[capacity]; // Выделяем память для массива с начальной вместимостью 10.
}
// Деструктор класса Array
template <typename T>
Array<T>::~Array() {
delete[] data; // Освобождаем память, выделенную для массива
}
// Метод для изменения размера массива
template <typename T>
void Array<T>::resize() {
capacity *= 2; // Удваиваем текущую вместимость
T* newData = new T[capacity]; // Создаем новый массив с увеличенной вместимостью
for (int i = 0; i < size; ++i) {
newData[i] = data[i]; // Копируем старые данные в новый массив
}
delete[] data; // Освобождаем старый массив
data = newData; // Перенаправляем указатель на новый массив
}
// Метод добавления элемента в конец массива
template <typename T>
void Array<T>::mpush(const T& element) {
if (size == capacity) { // Проверяем, нужно ли увеличивать размер массива
resize();
}
data[size++] = element; // Добавляем элемент и увеличиваем размер
}
// Метод вставки элемента по указанному индексу
template <typename T>
void Array<T>::minsert(int index, const T& element) {
if (index < 0 || index > size) {
throw out_of_range("Index out of range"); // Проверяем, находится ли индекс в допустимых пределах
}
if (size == capacity) {
resize();
}
for (int i = size; i > index; --i) {
data[i] = data[i - 1]; // Сдвигаем элементы вправо, чтобы освободить место для нового элемента
}
data[index] = element; // Вставляем новый элемент по заданному индексу
size++; // Увеличиваем размер массива
}
// Метод удаления элемента по указанному индексу
template <typename T>
void Array<T>::mdel(int index) {
if (index < 0 || index >= size) {
throw out_of_range("Index out of range"); // Проверяем, находится ли индекс в допустимых пределах
}
for (int i = index; i < size - 1; ++i) {
data[i] = data[i + 1]; // Сдвигаем элементы влево, чтобы удалить элемент
}
size--; // Уменьшаем размер массива
}
// Метод для получения элемента по индексу
template <typename T>
T Array<T>::mprint(int index) const {
if (index < 0 || index >= size) {
throw out_of_range("Index out of range"); // Проверяем, находится ли индекс в допустимых пределах
}
return data[index]; // Возвращаем элемент по индексу
}
// Метод замены элемента по указанному индексу
template <typename T>
void Array<T>::mreplace(int index, const T& element) {
if (index < 0 || index >= size) {
throw out_of_range("Index out of range"); // Проверяем, находится ли индекс в допустимых пределах
}
data[index] = element; // Заменяем элемент по индексу
}
// Метод получения текущего размера массива
template <typename T>
int Array<T>::mlength() const {
return size;
}
// Метод для печати содержимого массива
template <typename T>
void Array<T>::mget() const {
for (int i = 0; i < size; ++i) {
cout << data[i] << " "; // Выводим каждый элемент массива
}
cout << endl;
}
// Метод для считывания массива из файла
template <typename T>
void Array<T>::loadFromFile(const string& filename) {
ifstream inFile(filename);
if (!inFile) {
throw runtime_error("Unable to open file for reading");
}
T value;
while (inFile >> value) {
mpush(value); // Добавляем элементы в массив
}
inFile.close(); // Закрываем файл
}
// Метод для записи массива в файл
template <typename T>
void Array<T>::saveToFile(const string& filename) const {
ofstream outFile(filename);
if (!outFile) {
throw runtime_error("Unable to open file for writing");
}
for (int i = 0; i < size; ++i) {
outFile << data[i] << " "; // Записываем каждый элемент массива в файл
}
outFile.close(); // Закрываем файл
}
#endif