Стек на основе динамического массива, с++
Я пытался реализовать на си++ стек с помощью динамического массива. В приведенном ниже фрагменте реализация метода push. Просто создаю динамический массив на 1 элемент больше, копирую его со старого, удаляю старый массив и его указателю присваиваю новый массив. Однако в основной программе в cout выводится мусор, причем вместо первых 3 элементов(которые заданы константно) тоже мусор. В рамках отладки выводил массив stack в конце функции, все показывает правильно...
Скажите пожалуйста, что здесь не так? И можно ли как-то обойти эту проблему? Спасибо.
#include <iostream>
using namespace std;
void push(int *stack, int size, int a)
{
int *new_stack = new int[size + 1];
for (int i = 0; i < size; ++i)
new_stack[i] = stack[i];
delete[] stack;
stack = new_stack;
stack[size] = a;
};
int main()
{
int *stack = new int[3];
stack[0] = 6;
stack[1] = 3;
stack[2] = 7;
push(stack, 3, 5);
for(int i=0; i<4; ++i)
cout « stack[i] « " ";
delete[] stack;
}
Ответы (2 шт):
Оставим в стороне неэффективность вашего подхода...
Итак,
void push(int *stack, int size, int a)
...
stack = new_stack;
Этим вы заменили только лишь копию, переданную в функцию, но не само значение переменной: после
push(stack, 3, 5);
значение stack остается тем же.
Раз у вас C++ - передавайте указатель по ссылке:
void push(int*&stack, int size, int a)
тогда переданная переменная "почувствует" изменения, сделанные в функции.
void push(int *stack, int size, int a)
ваша ошибка вот тут
вы удаляете массив stack и создаете новый new_stack, но вы можете новый передать только внутри своей функции, для того, чтобы изменять переменные ВНЕ функции, надо передавать их в функцию по ссылке:
void push(int* &stack, int size, int a)
или как вариант - передавайте указатель на ваш массив (т.е. на указатель)
void push(int** stack, int size, int a)
правда тогда с ним придется работать чуть по другому
new_stack[i] = *stack[i];
и
push(&stack, 3, 5);
что не очень то удобно и наглядно и для c++ лучше уж использовать ссылки
P.S.
вообще если вы часто будете вставлять новые элементы, то система офигеет выделять и удалять память, производительность такого кода будет нулевой
лучше делать так:
обернуть ваш массив в структуру у которой будет поля - указатель на массив, размер массива, максимальный размер массива
struct myarray { int* array = nullptr; int size = 0; int capacity = 0; }когда вам надо добавить новый элемент вы проверяете - а
size < capacityи если да, то просто увеличиваетеsizeна 1 и задаете значение нового элементаесли
size == capacity, то вы создаете новый массив размеромcapacity * 2(ну или массив большего размера на полтора, на 20% или еще на что-то, что способно выдержать несколько операций записи без выделения и удаления памяти)ну и копирование из массива в массив лучше не с помощью поэлементного копирования, а через
memcpy(new_arr, arr, sizeof(int) * size)