1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
1

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

06.12.2015, 14:16. Показов 6918. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2015, 14:16
Ответы с готовыми решениями:

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

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

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

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

19
2760 / 1914 / 569
Регистрация: 05.06.2014
Сообщений: 5,569
06.12.2015, 15:08 2
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  [ТС] 3
Цитата Сообщение от Renji Посмотреть сообщение
Где вместо "const T &a" явно или не явно используется указатель this.
Я с этим *this вообще ничего не понял
Только я не понял код
Что это и куда ?
Я же просто поменял указатель на новую память
Мне даже его засунуть некуда
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
06.12.2015, 15:40 4
Большая коллекция решенных задач
там есть некий вектор с итераторами. может то, что вы и хотите. если нет - то на форуме полно других вариантов самодельных векторов. поищите.
0
2760 / 1914 / 569
Регистрация: 05.06.2014
Сообщений: 5,569
06.12.2015, 16:43 5
Цитата Сообщение от jazzspell Посмотреть сообщение
Я с этим *this вообще ничего не понял
Метод - такая функция объявленная внутри класса. Вызывается конструкцией вида object->method(). При этом method неявно получает указатель this ведущий на object.
Цитата Сообщение от jazzspell Посмотреть сообщение
Я же просто поменял указатель на новую память
Ну так не надо его менять. Нужно:
1) Создать новый массив.
2) Скопировать в него старый.
3) Снести старый массив.
4) Записать указатель на новый массив, в указатель на старый массив.

А если вам там в вектор только числа складывать, то выучить malloc, realloc и free и вся недолга.
0
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 17:09 6
Вот такой вариант например:
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  [ТС] 7
Цитата Сообщение от Renji Посмотреть сообщение
1) Создать новый массив.
2) Скопировать в него старый.
3) Снести старый массив.
4) Записать указатель на новый массив, в указатель на старый массив.
я это прекрасно понимаю
я не пойму, как это реализовать
точнее пункт - как скопировать
0
2760 / 1914 / 569
Регистрация: 05.06.2014
Сообщений: 5,569
06.12.2015, 20:44 8
Цитата Сообщение от jazzspell Посмотреть сообщение
я это прекрасно понимаю
я не пойму, как это реализовать
точнее пункт - как скопировать
А мой код что по вашему делает, если не копирование одного массива в другой?
0
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 20:57 9
Renji, в самом простом всегда найдут непонимание)
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:06  [ТС] 10
Цитата Сообщение от 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
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:09 11
jazzspell, Так ты методы класса реализуешь или функции?
0
2760 / 1914 / 569
Регистрация: 05.06.2014
Сообщений: 5,569
06.12.2015, 21:09 12
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  [ТС] 13
Цитата Сообщение от 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
2760 / 1914 / 569
Регистрация: 05.06.2014
Сообщений: 5,569
06.12.2015, 21:14 14
Цитата Сообщение от jazzspell Посмотреть сообщение
Полный бред, даже проверять не буду
Если месье лучше советчиков знает что бред, что нет, может он тогда не будет лезть сюда за советами?
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:16  [ТС] 15
Цитата Сообщение от Renji Посмотреть сообщение
Если месье лучше советчиков знает что бред, что нет, может он тогда не будет лезть сюда за советами?
Ой, лол
У меня половина кода не отобразилась в браузере
Сорян
0
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:16 16
jazzspell, Вообще-то, там описано все верно.
Ты делаешь класс, а значит методы внутри класса... какие к черту функции?
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:22  [ТС] 17
Цитата Сообщение от 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
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:25 18
jazzspell, а, вот что за ужас ты творишь)
А чем тебе свои методы не угодили?) Дружбу навел тут)
0
1 / 1 / 0
Регистрация: 12.08.2015
Сообщений: 42
06.12.2015, 21:33  [ТС] 19
Цитата Сообщение от SuperKir Посмотреть сообщение
А чем тебе свои методы не угодили?) Дружбу навел тут)
Если честно - то я не понял немножко, как их реализовывать
Да и как-то к функции проще обращаться )
Вот так все работает, кроме того, как присвоить новое число
0
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.12.2015, 21:54 20
Лучший ответ Сообщение было отмечено 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2015, 21:54
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru