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

Сделать массив расширяемым - C++

Восстановить пароль Регистрация
 
Ocean1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 26
03.07.2015, 23:18     Сделать массив расширяемым #1
Никак не получается сделать динамический массив расширяемым , помогите пожалуйста, где,что не так?
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
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
160
161
162
163
164
165
166
167
168
169
#include<iostream>
using namespace std;
 
class myVector
{
 int *arr, size,var,count;
public:
    myVector(int s=5):var(0), size(s), count(0)
    {
        arr=new int[size];
        
        }
    ~myVector()
    {
        if (arr) delete[]arr;
    }
    void addEnd(int x);
    void addFirst(int x);
    void addIndex(int x, int pos);
    void show();
};
void myVector::addEnd(int x)
{
 
    if (count>=size)
    {
        int *temp=new int[size];
        for(int i=0;i<=count;i++)
            temp[i]=arr[i];
        delete []arr;
        size=2*size;
        arr=new int[size];
        for (int i=0;i<=count;i++)
            arr[i]=temp[i];
        arr[count+1]=x;
        count ++;
        delete []temp;
}
    else 
    {
        arr[count+1]=x;
count ++;
    }
}
void myVector::addFirst(int x)
{
    if (count<size)
    {
        int *temp=new int[size];
        temp[0]=x;
        for (int i=0;i<=count;i++)
            temp[i+1]=arr[i];
        
        for (int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
    }
    else
    {
        size=size*2;
        int *temp=new int[size];
        temp[0]=x;
        for(int i=0;i<=count;i++)
        temp[i+1]=arr[i];
        delete []arr;
        arr=new int[size];
        for(int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
 
 
    }
}
void myVector::addIndex(int x, int pos)
{
    if (count<size)
    {
        int *temp=new int[size];
        for (int i=0;i<pos;i++)
            temp[i]=arr[i];
        
        for(int i=pos;i<=count;i++)
            temp[i+1]=arr[i];
        temp[pos]=x;
        for (int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
        }
    else
    {
        size=2*size;
        int *temp=new int[size];
        temp [pos]=x;
        for (int i=0;i<pos;i++)
            temp[i]=arr[i];
        for(int i=pos;i<=count;i++)
            temp[i+1]=arr[i];
        delete []arr;
        arr=new int[size];
        for (int i=0;i<=count+1;i++)
            arr[i]=temp[i];
        count++;
        delete []temp;
 
    }
}
void myVector::show()
{
    for(int i=1; i<=count;i++)
    {
        cout<<arr[i]<<" ";
 
    }
    cout<<endl;
}
 
int main()
{
    setlocale( LC_ALL,"Russian" );
    myVector arr;
    int pos, c,x;
    
    while(true)
    {
    cout<<"выберите действие"<<endl<<"1.добавить элемент в конец"<<endl<<"2.добавить элемент в начало"<<endl<<"3.добавить элемент в середину с указанием индекса"<<endl;
    cout<<"0.вывести на экран"<<endl;
    cin>>c;
    switch(c)
    {
    case 1:
        {
            cout<<"введите добавляемый элемент"<<endl;
                cin>>x;
            arr.addEnd(x);
            break;
        }
    case 2:
        {
            cout<<"введите добавляемый элемент"<<endl;
            cin>>x;
            arr.addFirst(x);
            break;
        }
    case 3:
        {
            cout<<"укажите позицию добавляемого элемента"<<endl;
            cin>>pos;
            cout<<"введите добавляемый элемент"<<endl;
            cin>>x;
            arr.addIndex(x,pos);
            break;
        }
    case 0:
        {
            arr.show();
            break;
        }
    default:
        exit(1);
    }
    }
 
 
system("pause");
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 23:18     Сделать массив расширяемым
Посмотрите здесь:

C++ Сделать массив упорядоченым...
из строки сделать массив C++
C++ Дан массив из прототипов функций или указателей на функцию, сделать функцию, возвращающую этот массив
C++ пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки.
Файлы и массив (сделать так, чтобы массив заполнялся значениями из этого же файла) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sn1p3rOk
 Аватар для Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,078
Завершенные тесты: 2
04.07.2015, 00:02     Сделать массив расширяемым #2
Вот такой вариант. Не для каждого подойдет, но все же.
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
#include <string> // Обязательно для подключения
 
int main()
{
    int lenght = 0;
    
    int* arr = new int[lenght];
 
    lenght = 10;
 
    for (int i = 0; i < lenght; i ++)
    {
        arr[i] = 3;
    }
 
    lenght = 15;
 
    for (int i = lenght - 5; i < lenght; i ++)
    {
        arr[i] = 10;
    }
 
    for (int i = 0; i < lenght; i ++)
    {
        printf("%d", arr[i]);
    }
 
    return 0;
}
Ocean1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 26
04.07.2015, 00:12  [ТС]     Сделать массив расширяемым #3
спасибо конечно,но это не то
Etien
20 / 20 / 0
Регистрация: 26.01.2014
Сообщений: 176
04.07.2015, 00:28     Сделать массив расширяемым #4
Извини, у тебя там почти 200 строк текста. Осилить не просто.
Но когда-то доводилось формировать массивы по количеству принимаемых чисел. Ничего лучшего не придумал, как заказать динамический массив в один байт, прочитать в него число. Если следующее чтение снова давало число, то заказываю массив в два байта, копирую старый массив в новый, освобождаю старый, а в последной элемент нового загоняю новое прочитанное число. Так продолжаю пока идут данные. Как только финиш - подсчитываю размер получившегося массива и пользуюсь им.
Естественно, если ты получаешь свои данные не побайтно, то и массив запрашиваешь такой, какой тебе нужно. И шаг наращивания тоже.
Всегда твой - Etien
ThePlague
 Аватар для ThePlague
95 / 95 / 59
Регистрация: 30.06.2015
Сообщений: 262
04.07.2015, 00:48     Сделать массив расширяемым #5
Ocean1, мельком глянул ваш код, у вас должна вылетать ошибка памяти "хип-баффера" после 5го элемента. Так как вы резервируете баффер под 5 элементов.

C++
1
myVector(int s=5):var(0), size(s), count(0)
Добавлено через 9 минут
Мой совет вызывать стандартный конструктор так:

C++
1
myVector(): var(0), count(0), arr(NULL), size(0){}
А уже патом не посредственно в функциях определять объекту нужный размер!
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,956
04.07.2015, 00:56     Сделать массив расширяемым #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
class my_vector
{
public:
    ~my_vector(){free(_data);}
 
    int capacity()const{return _capacity;}
    int size()const{return _size;}
    int*data(){return _data;}
    const int*data()const{return _data;}
 
    void push_back(int value){insert(size(),value);}
    void push_front(int value){insert(0,value);}
    void insert(int pos,int value);
private:
    int _capacity=0,_size=0;
    int*_data=0;
};
 
void my_vector::insert(int pos,int value)
{
    if(size()==capacity())
    {
        _capacity=_capacity?_capacity*2:2;
        _data=(int*)realloc(_data,sizeof(int)*_capacity);
    }
    memmove(data()+pos+1,data()+pos,sizeof(int)*(size()-pos));
    data()[pos]=value;
    ++_size;
}
Ocean1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 26
04.07.2015, 00:59  [ТС]     Сделать массив расширяемым #7
да, я понимаю, что когда элементов больше 5 ,то вылетает с ошибкой, но по сути в функции добавления у меня реализовано увеличение размера массива в 2 раза: если элементов становится больше,чем сам размер, то создаю временный массив в него копирую текущий, удаляю текущий, увеличиваю размер в два раза, определяю текущий с новым размером, копирую элементы временного туда + новый элемент, временный удаляю, но почему этого не происходит не могу понять почему... каким тогда задать изначальный размер в конструкторе?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2015, 01:41     Сделать массив расширяемым
Еще ссылки по теме:

C++ надо сделать массив
C++ Как сделать указатель на массив
C++ Как сделать двумерный массив

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

Или воспользуйтесь поиском по форуму:
ThePlague
 Аватар для ThePlague
95 / 95 / 59
Регистрация: 30.06.2015
Сообщений: 262
04.07.2015, 01:41     Сделать массив расширяемым #8
В стандартном конструкторе как я уже написал выше.
Если хотите при создании объекта иметь возможность указывать величину массива, тогда напишите еще один конструктор с передаваемым параметром размера!

Примерно так:

C++
1
2
3
4
5
myVector(int size)
{
this->size = size;
this->arr = new int[size];
}
Yandex
Объявления
04.07.2015, 01:41     Сделать массив расширяемым
Ответ Создать тему
Опции темы

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