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

Добавление элемента в начало динамического массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 73, средняя оценка - 4.79
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
02.04.2012, 01:28     Добавление элемента в начало динамического массива #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
// выводится меню -  добавть, удалить, вывести.
// работает с дин мас.
// открывается доп меню - добавть в конец, в начало, в середину
//
 
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
void Show (int *arr, int Size)
{
    cout<<"New mas: ";
    for (int i=0; i<Size; i++)
    {
        cout<<arr[i]<<" ";
    }
    getch();
}
 
void main ()
{
 
    int size=0;
    int *mas=new int[size];
    if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        cin>>mas[0];
        size++;
    }
    system("cls");
 
    int n;
 
    do
    {
        system("cls");
        cout<<"Show mas             - 1\n";
        cout<<"Add elem to mas      - 2\n";
        cout<<"Delete elem from mas - 3\n";
        cout<<"Exit mas             - 0\n";
        cin>>n;
 
        switch(n)
        {
        case 1:
                Show (mas, size);
            break;
        case 2:
            cout<<endl;
            cout<<"Add elem to end of mas    - 1\n";
            cout<<"Add elem to begin of mas  - 2\n";
            cout<<"Add elem to middle of mas - 3\n";
            cin>>n;
 
            if (n==1)
            {
                cout<<endl;
                cout<<"Enter element: ";
                cin>>mas[size++];
                Show (mas, size);
            }
// добавление элемента в динамический массив
            if(n==2)
            {
                int *temp=new int[size++];
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
                
                cout<<"Enter element: ";
                cin>>temp[0];
                mas=temp;
                
                Show (mas, size);                           
            }
        
            if(n==3)
            {
 
            }
            break;
        case 3:
            delete [] mas;
            exit(0); 
            break;
        default:
            cout<<"Sorry, error!!! Try agan\n";
            getch();
        }
 
    }
    while(n!=0);
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
02.04.2012, 02:05     Добавление элемента в начало динамического массива #2
C++
1
2
3
4
5
6
7
8
int size=0;
int *mas=new int[size];
if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        cin>>mas[0]; // !!!
//...
А почему размер массива равен нулю? Че эт за массив без элементов?
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
03.04.2012, 01:29  [ТС]     Добавление элемента в начало динамического массива #3
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int size=0;
int *mas=new int[size];
if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        cin>>mas[0]; // !!!
//...
А почему размер массива равен нулю? Че эт за массив без элементов?
а что массив обязательно должен содержать элементы. Их можно потом добавить

Добавлено через 1 минуту
Ребята, а кто-нибудь может подсказать по поводу добавления элементов в начало динамического массива и что в моем коде не верно? Зарание спасибо
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
03.04.2012, 01:31     Добавление элемента в начало динамического массива #4
а что массив обязательно должен содержать элементы. Их можно потом добавить
Не в C++;
В С++ для этого есть std::vector<T>, std::list<T> другие контейнеры STL
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
03.04.2012, 01:38  [ТС]     Добавление элемента в начало динамического массива #5
Цитата Сообщение от Avazart Посмотреть сообщение
Не в C++;
В С++ для этого есть std::vector<T>, std::list<T> другие контейнеры STL

векторые еще не учил, разбираюсь с динамическими массивами. Вы можете подсказать по моему вопросу
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
03.04.2012, 01:58     Добавление элемента в начало динамического массива #6
Размер массива менять нельзя нужно сразу указывать нужное кол-во при объявлении.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
03.04.2012, 02:07     Добавление элемента в начало динамического массива #7
Если хочешь сделать самостоятельно динамический массив с добавлениями, это вполне хорошее упражнение и, конечно имеет право на существование. Всё-таки не очень честно использовать вектора, не разобравшись как выделяется/удаляется память в простых динамических массивах. Так что не слушай советчиков. Контроль памяти это одна из важнейших вещей при программировании на C

Так вот эта память у тебя течёт. У тебя в коде это однозначно вызывает утечку
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *temp=new int[size++];
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
               //сохранил старый mas в расширенном новом куске памяти, массиве
                // А после копирования данных в этот кусок
//ОБЯЗАТЕЛЬНО  освободи её из старого
                  delete[] mas;//!!!!!
                cout<<"Enter element: ";
                cin>>temp[0];
                mas=temp;
А вообще продвинутые менеджеры памяти выделяют кусок не по одному элементу, а с большим запасом на N элементов. Подумай над этим.
например
C++
1
2
3
const int CHUNK_SIZE=50;
size+=CHUNK_SIZE;
int *temp=new int[size];
Я где-то слышал, что стандартные вектора используют какой-то хитрый алгоритм определения размера добавляемого куска. Они то ли с каждым разом в два раза больше добавляют, то ли ещё что
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
03.04.2012, 02:19  [ТС]     Добавление элемента в начало динамического массива #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Если хочешь сделать самостоятельно динамический массив с добавлениями, это вполне хорошее упражнение и, конечно имеет право на существование. Всё-таки не очень честно использовать вектора, не разобравшись как выделяется/удаляется память в простых динамических массивах. Так что не слушай советчиков. Контроль памяти это одна из важнейших вещей при программировании на C

Так вот эта память у тебя течёт. У тебя в коде это однозначно вызывает утечку
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *temp=new int[size++];
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
               //сохранил старый mas в расширенном новом куске памяти, массиве
                // А после копирования данных в этот кусок
//ОБЯЗАТЕЛЬНО  освободи её из старого
                  delete[] mas;//!!!!!
                cout<<"Enter element: ";
                cin>>temp[0];
                mas=temp;
А вообще продвинутые менеджеры памяти выделяют кусок не по одному элементу, а с большим запасом на N элементов. Подумай над этим.
например
C++
1
2
3
const int CHUNK_SIZE=50;
size+=CHUNK_SIZE;
int *temp=new int[size];
Я где-то слышал, что стандартные вектора используют какой-то хитрый алгоритм определения размера добавляемого куска. Они то ли с каждым разом в два раза больше добавляют, то ли ещё что
Спасибо, буду разбираться
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
03.04.2012, 02:53     Добавление элемента в начало динамического массива #9
Вообще тут задача не совсем корректна и надо говорить не о прототипе вектора а о прототипе листа(списка) или дека та как добавлять элементы надо в начало, а не в конец.

А копировать элементы из массива в массив каждый раз когда надо добавить новый элемент это как-то не очень...
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
03.04.2012, 03:23     Добавление элемента в начало динамического массива #10
Цитата Сообщение от Avazart Посмотреть сообщение
А копировать элементы из массива в массив каждый раз когда надо добавить новый элемент это как-то не очень...
А что поделаешь? Массивы предоставляют уникальную возможность обращаться к любому случайно выбранному элементу за одинаковое минимальное время. А также располагать все элементы друг за другом в одном куске памяти. Согласись, это весьма ценные свойства. Так что всему своё применение: в стандартной библиотеке есть vector, а есть list - и необходимость возникает бывает то в одном, то в другом. Собственно в теме мы обсуждаем самодельный аналог вектора. Чем же он, vector, бесполезен? Ты же на это намекаешь?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
03.04.2012, 03:59     Добавление элемента в начало динамического массива #11
Я намекаю на то что задание не продуманное и совсем не на динамические массивы.
Понятно если бы изучались классы или очереди/стеки, а так это только запутывание студента.
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
04.04.2012, 01:32  [ТС]     Добавление элемента в начало динамического массива #12
Ребята я допетрил как добавить элемент в начало динамического массива и у меня заработало (решение ниже). Правда это у меня получилось через грамоздко: через поэлеметную перезапись из одного массива в другой. А задача стояла чтобы это сделать через смену указателей Кто-то может подсказать как это можно сделать
Всем спасибо, кто проникся моим вопросом и не оставил без внимания

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
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
void Show (int *arr, int Size)
{
    cout<<"New mas: ";
    for (int i=0; i<Size; i++)
    {
        cout<<arr[i]<<" ";
    }
    getch();
}
 
void main ()
{
 
    int size=0;
    int *mas=new int[size];
    if (size==0)
    {
        cout<<"Mas  empty\n";
        cout<<"Enter first element of mas: ";
        size++;
        cin>>mas[0];
 
    }
                int *temp=new int[size+1];
 
                cout<<"Enter element: ";
                cin>>temp[0];
 
                for (int i=0; i<size; i++)
                {
                    temp[i+1]=mas[i];
                }
                size++;
                for (int i=0; i<size; i++)
                {
                    mas[i]=temp[i];
                }
                Show (mas, size);  
                delete [] temp;
            
 
    delete [] mas;
}
Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Я намекаю на то что задание не продуманное и совсем не на динамические массивы.
Понятно если бы изучались классы или очереди/стеки, а так это только запутывание студента.
Задание конечно до конца не продумано. Но суть зад аниянаучиться работать с динамической памятью и указателями
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
04.04.2012, 02:28     Добавление элемента в начало динамического массива #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//...
cout<<"Enter element: ";
cin>>temp[0];
 
for (int i=0; i<size; i++)
  {
  temp[i+1]=mas[i];
  }
size++;
 
delete [] mas; // удаляем старый массив
mas = temp // теперь mas указывает на новое расположение нового массива
Show (mas, size);
                          
delete [] mas;//temp удалять не надо так как это тот же mas
//...
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.04.2012, 02:32     Добавление элемента в начало динамического массива #14
Цитата Сообщение от geka83 Посмотреть сообщение
int *temp=new int[size++];
Размер выделится как и на старый массив. Так как инкремент постфиксный. То есть сначала выделится память под size, а потом только size увеличится на 1. Стоит исправить на ++size.
Ой не увидел последний код автора Там исправлено
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.04.2012, 03:15     Добавление элемента в начало динамического массива #15
Цитата Сообщение от Avazart Посмотреть сообщение
// удаляем старый массив
// теперь mas указывает на новое расположение нового массива
Плюсую Avazart, в последнем коде ТС ошибка всё равно присутствовала.
geka83
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 6
04.04.2012, 23:20  [ТС]     Добавление элемента в начало динамического массива #16
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//...
cout<<"Enter element: ";
cin>>temp[0];
 
for (int i=0; i<size; i++)
  {
  temp[i+1]=mas[i];
  }
size++;
 
delete [] mas; // удаляем старый массив
mas = temp // теперь mas указывает на новое расположение нового массива
Show (mas, size);
                          
delete [] mas;//temp удалять не надо так как это тот же mas
//...
Avazart , попробовал твой вариант, но почему-то после ввода элемента cin>>temp[0]; ничего не происходит. Т.е. и не печатает новый массив и не выдает ни какой ошибки, просто курсор мигает в консоли и все.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2012, 23:32     Добавление элемента в начало динамического массива
Еще ссылки по теме:

C++ Добавление элемента в начало массива
C++ Добавление динамического элемента в статический массив
C++ Увеличение элемента динамического массива

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
04.04.2012, 23:32     Добавление элемента в начало динамического массива #17
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
using namespace std;
 
void Show (int *arr, int Size)
{
cout<<"New mas: ";
for (int i=0; i<Size; i++) cout<<arr[i]<<" ";
cout<<endl;
}
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
int size=0;
int *mas=new int[size];
 
if (size==0)
 {
 cout<<"Mas  empty\n";
 cout<<"Enter first element of mas: ";
 size++;
 cin>>mas[0];
 }
 
int *temp=new int[size+1];
cout<<"Enter element: ";
cin>>temp[0];
 
for (int i=0; i<size; i++) temp[i+1]=mas[i];
size++;
 
delete [] mas; // удаляем старый массив
mas = temp; // теперь mas указывает на новое расположение нового массива
Show (mas, size);
 
delete [] mas;//temp удалять не надо так как это тот же mas
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
У меня нормально работает.
Миниатюры
Добавление элемента в начало динамического массива  
Yandex
Объявления
04.04.2012, 23:32     Добавление элемента в начало динамического массива
Ответ Создать тему
Опции темы

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