Форум программистов, компьютерный форум CyberForum.ru

Написание класса Vector - C++

Восстановить пароль Регистрация
 
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
06.03.2014, 13:07     Написание класса Vector #1
Класс вектор - для вещественных чисел. Реализованы методы добавления числа в конец массива - инсерт, и удаления с итый по житый элемент массива (эрейс). Как корректно вызвать функции эрейс и инсерт?

C++ (Qt)
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
class Vector
{
    double *v;
    int N;
public:
    Vector (int len)
    { v=new double [len];
      N=len;
    }
 
    ~Vector () { delete [] v;}
 
    Vector (const Vector &temp)
    {
        N=temp.N;
        v=new double [temp.N];
        for (int i=0; i<N; i++)
        {
            v[i]=temp.v[i];
        }
    }
 
    double &operator [] (int temp)
    {return v[temp]; }
 
    Vector insert (double k)
    { 
        double *m;
        m=new double [N+1];
        for (int i=0; i<N; i++)
        {
            m[i]=v[i];
        }
        m[N]=k;
        delete [] v;
        v=new double [N+1];
        for (int i=0; i<N; i++)
        {
            v[i]=m[i];
        }
        delete [] m;
        return *this;
    }
 
    Vector erase (int i, int j)
    {
        double *m;
        m=new double [N-j+i-1];
        for (int p=0; p<=i; p++)
        {
            m[p]=v[p];
        }
        for (int p=j; p<N; p++)
        {
            m[p]=v[p];
        }
        delete []v;
        v=new double [N-j+i-1];
        for (int p=0; p<N-j+i-1; p++)
        {
            v[p]=m[p];
        }
        delete []m;
        return *this;
    }
 
 
 
 
};
 
int main ()
{
    Vector a(10);
    for (int p=0; p<10; p++)
    {
        cin>>a[p];
    }
 
    a=insert(100);
 
    a=erase(5,7);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2014, 13:07     Написание класса Vector
Посмотрите здесь:

C++ Vector как член класса
Объявление vector'а членом класса C++
C++ Метод push_back() класса vector
C++ Итератор класса vector
Разработка класса Vector C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
06.03.2014, 13:15     Написание класса Vector #2
Цитата Сообщение от biruld Посмотреть сообщение
Реализованы методы добавления числа в конец массива - инсерт
Ну уж тогда не insert(), а push_back(), если проводить аналогию с библиотечным классом vector.

Добавлено через 2 минуты
Цитата Сообщение от biruld Посмотреть сообщение
Как корректно вызвать функции эрейс и инсерт?
Через объект класса Vector, как же еще

Добавлено через 1 минуту
Цитата Сообщение от biruld Посмотреть сообщение
a=insert(100);
a=erase(5,7);
a.insert(100);
a.erase(5, 7);
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
06.03.2014, 13:16  [ТС]     Написание класса Vector #3
можно поподробней? две последние строчки программы - пыталась вызвать эти методы. что-то я делаю не так...

инсерт - такое вот задание

Добавлено через 37 секунд
спасибо!!!
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
06.03.2014, 13:28     Написание класса Vector #4
biruld, не пойму, а зачем вам определять методы erase() и insert() так, чтобы они возвращали *this? Ведь они и так получают доступ к элементам данных объекта, посредством которого они вызываются. Не проще ли сделать тип возвращаемого значения у этих методов void? А уж если нужно будет присвоить один вектор другому (а скорее всего без этого не обойтись) перегрузить еще операцию = для вашего класса Vector?
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
06.03.2014, 13:34  [ТС]     Написание класса Vector #5
Цитата Сообщение от Extrim88 Посмотреть сообщение
biruld, не пойму, а зачем вам определять методы erase() и insert() так, чтобы они возвращали *this? Ведь они и так получают доступ к элементам данных объекта, посредством которого они вызываются. Не проще ли сделать тип возвращаемого значения у этих методов void? А уж если нужно будет присвоить один вектор другому (а скорее всего без этого не обойтись) перегрузить еще операцию = для вашего класса Vector?
я не понимаю, чем это проще для меня один фиг что через войд, что через вектор и this.
Присваивание можно перегрузить, но зачем?
У меня назрел еще один вопрос. Моя задача выдает какую-то глобальную ошибку в смысле брейкается на середине. Вот конечный код:
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
 
class Vector
{
    double *v;
    int N;
public:
    Vector (int len)
    { v=new double [len];
      N=len;
    }
 
    ~Vector () { delete [] v;}
 
    Vector (const Vector &temp)
    {
        N=temp.N;
        v=new double [temp.N];
        for (int i=0; i<N; i++)
        {
            v[i]=temp.v[i];
        }
    }
 
    double &operator [] (int temp)
    {return v[temp]; }
 
    Vector insert (double k)
    { 
        double *m;
        m=new double [N+1];
        for (int i=0; i<N; i++)
        {
            m[i]=v[i];
        }
        m[N]=k;
        delete [] v;
        v=new double [N+1];
        for (int i=0; i<N; i++)
        {
            v[i]=m[i];
        }
        delete [] m;
        return *this;
    }
 
    Vector erase (int i, int j)
    {
        double *m;
        m=new double [N-j+i-1];
        for (int p=0; p<=i; p++)
        {
            m[p]=v[p];
        }
        for (int p=j; p<N; p++)
        {
            m[p]=v[p];
        }
        delete []v;
        v=new double [N-j+i-1];
        for (int p=0; p<N-j+i-1; p++)
        {
            v[p]=m[p];
        }
        delete []m;
        return *this;
    }
 
friend istream& operator>> (istream &is, Vector &temp);
friend ostream& operator<< (ostream &os, Vector &temp);
 
 
 
 
 
 
};
 
istream& operator>> (istream &is, Vector &temp)
{
    for (int p=0; p<temp.N; p++)
    {
        is>>temp.v[p];
    }
    return is;
}
 
ostream& operator<< (ostream &os, Vector &temp)
{
    for (int p=0; p<temp.N; p++)
    {
        os<<temp.v[p];
    }
    return os;
}
 
int main ()
{
    Vector a(10);
    cin>>a;
    a.insert(100);
    cout<<a;
    a.erase(5,7);
    cout<<a;
    _getch();
}
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
06.03.2014, 14:05     Написание класса Vector #6
Цитата Сообщение от biruld Посмотреть сообщение
Моя задача выдает какую-то глобальную ошибку в смысле брейкается на середине
двойное освобождение памяти.
Поправка: Конструктор копирования таки есть (каюсь, просмотрел), значит проблема не в этом.
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
06.03.2014, 14:09  [ТС]     Написание класса Vector #7
DrOffset, да, констр. коп. есть. почему не аботает...
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
06.03.2014, 14:28     Написание класса Vector #8
C++
1
N-j+i-1
i = 5
j = 7
N = 10
10 - (5 + 7 - 1). чего-то тут не то отрицательное число получается. Надо эти условия проверять.

Это притом, что в методах insert и erase нигде не изменяется сама N, а ведь должна. Возможно проблема в этом.
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
06.03.2014, 14:30  [ТС]     Написание класса Vector #9
да, N я уже изменила, заметила. А насчет отрицательного числа -мтам таких скобочек не стояло)) 10-7+5-1=7
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
06.03.2014, 14:30     Написание класса Vector #10
biruld, в методе insert() вы не изменяете значение элемента данных N, точнее не увеличиваете на 1. Вы же добавили элемент в вектор, следовательно, и размер вектора необходимо увеличить.
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
06.03.2014, 14:36  [ТС]     Написание класса Vector #11
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
Vector insert (double k)
    { 
        double *m;
        m=new double [N+1];
        for (int i=0; i<N; i++)
        {
            m[i]=v[i];
        }
        m[N]=k;
        delete [] v;
        N=N+1;
        v=new double [N];
        for (int i=0; i<N; i++)
        {
            v[i]=m[i];
        }
        delete [] m;
        return *this;
    }
 
    Vector erase (int i, int j)
    {
        double *m;
        m=new double [N-j+i-1];
        for (int p=0; p<=i; p++)
        {
            m[p]=v[p];
        }
        for (int p=j; p<N; p++)
        {
            m[p]=v[p];
        }
        delete []v;
        N=N-j+i-1;
        v=new double [N];
        for (int p=0; p<N; p++)
        {
            v[p]=m[p];
        }
        delete []m;
        return *this;
    }
Добавлено через 17 секунд
и все равно не работает
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
06.03.2014, 14:59     Написание класса Vector #12
biruld, много лишнего у вас было. Про скобки, my bad. Однако удаление было неправильным: копирование элементов в erase стреляло за границу массива (v) и портило heap.
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
    void insert (double k)
    {
        double * m = new double[N + 1];
        for(int i = 0; i < N; i++)
        {
            m[i] = v[i];
        }
        m[N] = k;
        delete [] v;
        v  = m;
        N += 1;
    }
 
    void erase(int i, int j)
    {
        int newN = N - j + i;
        if(newN <= 0 || i > j)
        {
            return;
        }
        double *m = new double [newN];
        int k;
        for(k = 0; k < i; k++)
        {
            m[k] = v[k];
        }
        for(int p = j; p < N; p++)
        {
            m[k++] = v[p];
        }
        delete [] v;
        v  = m;
        N -= abs(i - j);
    }
надеюсь сохранил первоначально задуманное поведение. i,j это ведь диапазон для удаления?
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
06.03.2014, 15:04     Написание класса Vector #13
biruld, попробуйте такой вариант метода erase():

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void erase (int i, int j)
    {
        double *m;
        m=new double [N - (j - i + 1)];
        for (int p=0; p<i; p++)
        {
            m[p] = v[p];
        }
        for (int p = j + 1; p < N; p++)
        {
            m[p - (j - i + 1)] = v[p];
        }
        delete []v;
 
        N -= j - i + 1;
        v=new double [N];
        for (int p=0; p<N; p++)
        {
            v[p]=m[p];
        }
        delete []m;
   }
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
06.03.2014, 17:53  [ТС]     Написание класса Vector #14
Наверное, в аргументы тогда надо вставить Vector temp? и через него? честно говоря не понимаю как с войдом это должно работать

Добавлено через 6 минут
едиственное чо, там и-ж+1, а так спасибо большое, инсерт работает, эрейс сейчас буду пробовать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 17:57     Написание класса Vector
Еще ссылки по теме:

Vector и конструктор класса C++
Функция Erase класса vector C++
Возврат vector из класса C++

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

Или воспользуйтесь поиском по форуму:
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
06.03.2014, 17:57     Написание класса Vector #15
Цитата Сообщение от biruld Посмотреть сообщение
Наверное, в аргументы тогда надо вставить Vector temp?
Зачем? Метод класса вызывается через объект этого класса, и получает неявный доступ к его элементам данных. Зачем возвращать копию объекта, если вы его и так обрабатываете посредством данного метода.
Yandex
Объявления
06.03.2014, 17:57     Написание класса Vector
Ответ Создать тему
Опции темы

Текущее время: 12:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru