Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42

Свой класс вектор. Как расширить динамический массив

06.12.2015, 14:16. Показов 7828. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
krivoy cod
C++
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
#include <iostream>
using namespace std;
 
template<typename T>
class Vector
{
private:
    int current;
    int* m;
    int size;
    template <class T>//
    friend void showarray(const T &a);
    template <class T, typename TT>
    friend void addtoend(T&xx, TT tmp);
    
public:
    
    explicit Vector(T size) ://
        size(size),
        current(0)
    {
         m = new T[size];//
        cout << "running constructor for "  << size << " elements" << endl;
        for (int i = 0; i < size; i++)
        {
            m[i] = i;
        }
            
    }
    
 
    ~Vector()
    {
        cout << "Destroying m....." << endl;
        delete[] m;
    }
 
 
};
 
template <class T> // 
void showarray(const T &a)
{
    cout << "Current array:" << endl;
    for (int i = 0; i < a.size; i++)
    {
        cout << a.m[i] << " ";
    }
    cout << endl;
}
 
 
void allocarray(int * &p, int n)
{
    cout << "allocarray" << endl;
    p = new int[n];
 
}
 
template <class T, typename TT>
void addtoend(T&s, TT tmp)
{
    cout << "adding element to the end of array" << endl;
    s.size = s.size + 1;
    allocarray(s.m, s.size);
    //s.m[s.size-1] = tmp;
 
 
}
 
 
int main()
{
    Vector<int> xx(5);
    showarray(xx);
    addtoend(xx, 100);
    showarray(xx);
}

мое задание :
сделать свой класс вектор
сделать его динамическим (если надо - расширить, если надо - ужать)
что бы он умел добавлять в конец и в начало
что бы можно было удалить элемент со сдвигом. так же и добавлять
перегрузить операторы
сделать его шаблонным
------
В принципе, я знаю как это сделать, но вот у меня загвоздка :
Я хочу сделать функцию, которая добавляет элемент в конец массива.
Все ок, я массив расширил, но элементы старые - удались, вместо них теперь рандомная память
Как мне перенести все элементы из начального массива ?
Сори за кривой код, я тольк учусь
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2015, 14:16
Ответы с готовыми решениями:

Как расширить динамический массив НЕ используя stl
То есть создал я массив: int *arr = new int n-какое-то значение А дальше я хочу сделать массив arr длиной, n+5; или -5 без...

Расширить динамический массив
Есть програмка в которой можно внести даные про оформленые заявки на оренду машин. Каждая заявка ето обьект класа tz, Масив заявок...

Класс Вектор, поля класса: n- количество элементов массива, a - имя массива целых чисел(массив динамический)
Дана задача. Класс Вектор, поля класса: n- количество элементов массива, a - имя массива целых чисел(массив динамический). Создать...

19
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.12.2015, 15:08
C++
1
2
for(int i=0;i<size;++i)
    new_array[i]=old_array[i];
showarray, allocarray и прочее для работы с вектором, оформить как методы вектора. Где вместо "const T &a" явно или не явно используется указатель this.
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 15:17  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Где вместо "const T &a" явно или не явно используется указатель this.
Я с этим *this вообще ничего не понял
Только я не понял код
Что это и куда ?
Я же просто поменял указатель на новую память
Мне даже его засунуть некуда
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
06.12.2015, 15:40
Большая коллекция решенных задач
там есть некий вектор с итераторами. может то, что вы и хотите. если нет - то на форуме полно других вариантов самодельных векторов. поищите.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.12.2015, 16:43
Цитата Сообщение от jazzspell Посмотреть сообщение
Я с этим *this вообще ничего не понял
Метод - такая функция объявленная внутри класса. Вызывается конструкцией вида object->method(). При этом method неявно получает указатель this ведущий на object.
Цитата Сообщение от jazzspell Посмотреть сообщение
Я же просто поменял указатель на новую память
Ну так не надо его менять. Нужно:
1) Создать новый массив.
2) Скопировать в него старый.
3) Снести старый массив.
4) Записать указатель на новый массив, в указатель на старый массив.

А если вам там в вектор только числа складывать, то выучить malloc, realloc и free и вся недолга.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 17:09
Вот такой вариант например:
C++
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
template <typename T>
class Vect
{
protected:
    T *mas;
    int size;
public:
    Vect<T>();
    Vect<T>(int);
    void Print();
    void Creat();
    void Push(T);
};
 
template <typename T>
void Vect<T>::Print()
{
    for (int i = 0; i < size; i++)
        cout << mas[i] << "\t";
    cout << endl;
}
 
template <typename T>
Vect<T>::Vect()
{
    size = 0;
    mas = nullptr;
}
 
template <typename T>
Vect<T>::Vect(int _size)
{
    size = _size;
    mas = new T[size];
}
 
template <typename T>
void Vect<T>::Creat()
{
    srand(time(0));
    if (mas == nullptr)
    {
        cout << "Enter size: ";
        cin >> size;
        mas = new T[size];
    }
    for (int i = 0; i < size; i++)
        mas[i] = rand() % 100;
}
 
template <typename T>
void Vect<T>::Push(T x)
{
    this->size = this->size++;
    T *buf = new T[this->size];
    for (int i = 0; i < this->size - 1; i++)
        buf[i] = this->mas[i];
    buf[this->size-1] = x;
    delete[]mas;
    mas = buf;
}
 
int main()
{
    Vect <int> M;
    M.Creat();
    M.Print();
    M.Push(100);
    M.Print();
    _getch();   
}
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 20:35  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
1) Создать новый массив.
2) Скопировать в него старый.
3) Снести старый массив.
4) Записать указатель на новый массив, в указатель на старый массив.
я это прекрасно понимаю
я не пойму, как это реализовать
точнее пункт - как скопировать
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.12.2015, 20:44
Цитата Сообщение от jazzspell Посмотреть сообщение
я это прекрасно понимаю
я не пойму, как это реализовать
точнее пункт - как скопировать
А мой код что по вашему делает, если не копирование одного массива в другой?
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 20:57
Renji, в самом простом всегда найдут непонимание)
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:06  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
А мой код что по вашему делает, если не копирование одного массива в другой?
это я понял
я не понимаю, как собрать это все в кучу
C++
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
void allocarray(int *m, int n)
{
    cout << "allocarray" << endl;
    
    int *temp = new int[n];
    for (int i = 0; i < n; i++)
        temp[i] = m[i];
    *m = *temp;
    delete[]temp;
        
}
 
template <class T, typename TT>
void addtoend(T&s, TT tmp)
{
    cout << "adding element to the end of array" << endl;
    s.size = s.size + 1;
    allocarray(*&s.m, s.size);
    s.m[s.size+1] = tmp;
 
}
 
 
int main()
{
    Vector<int> xx(5);
    showarray(xx);
    addtoend(xx, 100);
    showarray(xx);
    addtoend(xx, 100);
    showarray(xx);
    
}
Теперь у меня все копируется, но не присвается значение новому элементу
хотя я написал
У меня кашаааааа
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:09
jazzspell, Так ты методы класса реализуешь или функции?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.12.2015, 21:09
C++
1
2
3
4
5
6
7
8
9
10
void allocarray(int *&m, int old_size,int new_size)
{
    cout << "allocarray" << endl;
    
    int *temp = new int[new_size];
    for (int i = 0; i < min(old_size,new_size); i++)
        temp[i] = m[i];
    delete m;
    m=temp;
}
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:12  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
void allocarray(int *&m, int old_size,int new_size)
{
* * cout << "allocarray" << endl;
int *temp = new int[new_size];
* * for (int i = 0; i < min(old_size,new_size); i++)
* * * * temp[i] = m[i];
* * delete m;
* * m=temp;
Полный бред, даже проверять не буду
Цитата Сообщение от SuperKir Посмотреть сообщение
Так ты методы класса реализуешь или функции?
Функции, не методы
И что лучше и чем ?

Может, переделаю
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.12.2015, 21:14
Цитата Сообщение от jazzspell Посмотреть сообщение
Полный бред, даже проверять не буду
Если месье лучше советчиков знает что бред, что нет, может он тогда не будет лезть сюда за советами?
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:16  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Если месье лучше советчиков знает что бред, что нет, может он тогда не будет лезть сюда за советами?
Ой, лол
У меня половина кода не отобразилась в браузере
Сорян
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:16
jazzspell, Вообще-то, там описано все верно.
Ты делаешь класс, а значит методы внутри класса... какие к черту функции?
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:22  [ТС]
Цитата Сообщение от SuperKir Посмотреть сообщение
Ты делаешь класс, а значит методы внутри класса... какие к черту функции?
C++
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
#include <iostream>
using namespace std;
 
template<typename T>
class Vector
{
private:
    int current;
    int* m;
    int size;
    template <class T>//
    friend void showarray(const T &a);
    template <class T, typename TT>
    friend void addtoend(T&xx, TT tmp);
    
public:
    
    explicit Vector(T size) ://
        size(size),
        current(0)
    {
         m = new T[size];//
        cout << "running constructor for "  << size << " elements" << endl;
        for (int i = 0; i < size; i++)
        {
            m[i] = i;
        }
            
    }
    
 
    ~Vector()
    {
        cout << "Destroying m....." << endl;
        delete[] m;
    }
 
 
};
 
template <class T> // 
void showarray(const T &a)
{
    cout << "Current array:" << endl;
    for (int i = 0; i < a.size; i++)
    {
        cout << a.m[i] << " ";
    }
    cout << endl;
}
 
 
void allocarray(int *m, int n)
{
    cout << "allocarray" << endl;
    
    int *temp = new int[n];
    for (int i = 0; i < n; i++)
        temp[i] = m[i];
    m = temp;
    delete[]temp;
        
}
 
template <class T, typename TT>
void addtoend(T&s, TT tmp)
{
    cout << "adding element to the end of array" << endl;
    s.size = s.size + 1;
    allocarray(*&s.m, s.size);
    s.m[s.size+1] = tmp;
 
}
 
 
int main()
{
    Vector<int> xx(5);
    showarray(xx);
    addtoend(xx, 100);
    showarray(xx);
    addtoend(xx, 100);
    showarray(xx);
    
}
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:25
jazzspell, а, вот что за ужас ты творишь)
А чем тебе свои методы не угодили?) Дружбу навел тут)
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:33  [ТС]
Цитата Сообщение от SuperKir Посмотреть сообщение
А чем тебе свои методы не угодили?) Дружбу навел тут)
Если честно - то я не понял немножко, как их реализовывать
Да и как-то к функции проще обращаться )
Вот так все работает, кроме того, как присвоить новое число
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:54
Лучший ответ Сообщение было отмечено jazzspell как решение

Решение

jazzspell, Держи:
Header.h
C++
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
#pragma once
#include "iostream"
 
using std::cout;
using std::endl;
 
template<typename T>
class Vector
{
private:
    int current;
    int* m;
    int size;
public:
    Vector<T>();
    Vector<T>(int);
    void showarray();
    void addtoend(T);
    void allocarray(int);
    ~Vector()
    {
        cout << "Destroying m....." << endl;
    }
 
 
};
 
template<typename T>
inline Vector<T>::Vector()
{
    size = 0;
    current = 0;
    m = nullptr;
}
 
 
template <typename T>
Vector<T>::Vector(int _size)
{
    size = _size;
    current = 0;
    m = new T[size];//
    cout << "running constructor for " << size << " elements" << endl;
    for (int i = 0; i < size; i++)
    {
        m[i] = i;
    }
 
}
 
template <typename T> 
void Vector<T>::showarray()
{
    cout << "Current array:" << endl;
    for (int i = 0; i < this->size; i++)
    {
        cout << this->m[i] << " ";
    }
    cout << endl;
}
 
template <typename T>
void Vector<T>::allocarray(int n)
{
    cout << "allocarray" << endl;
    int *temp = new int[n];
    for (int i = 0; i < n; i++)
        if (i < this->size) temp[i] = this->m[i];
        else temp[i] = 0;
    delete[]this->m;
    this->m = temp;
    this->size = n;
}
 
template <typename T>
void Vector<T>::addtoend(T tmp)
{
    cout << "adding element to the end of array" << endl;
    this->size++;
    allocarray(this->size);
    this->m[this->size - 1] = tmp;
}
Sourse.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Header.h"
#include "conio.h"
 
int main()
{
    Vector <int> x(5);
    x.showarray();
    x.allocarray(10);
    x.showarray();
    x.addtoend(102);
    x.showarray();
    _getch();
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2015, 21:54
Помогаю со студенческими работами здесь

Свой класс Динамический Список
Не совсем понимаю, как создать свой класс списка, элементами которого являются Записи. В тайпе объявил запись, но как начал описывать...

Создать класс, полями есть динамический вектор(то есть указатель на вектор) его размер и идентификатор
Задание нужно создать класс, полями есть динамический вектор(то есть указатель на вектор) его размер та идентификатор не получается в...

Создать динамический класс Book, содержащий динамический массив Authors
Мне нужно написать программу,а я не знаю как ее написать. Знаю, тут люди за кого-то не делают, укажите хотя бы направление. вот сама...

Создать динамический класс Book, содержащей динамический массив Authors
всем привет. может кто-то набросать код для такой вот задачи: Создать динамический класс Book, содержащей динамический массив...

Как расширить том в diskmgmt без преобразования в динамический диск?
Сабж. Фото прилагается, пытаюсь расширить диск New


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru