2017-02-15 9 views
1

Я создал указатель массива в качестве глобальной переменной, как это:Изменить размер массива C++

T *bag; 
     bag = new T[size]; 

У меня есть метод, где я вставить вещи в массив; однако, если он обнаруживает, что он переполнит массив, мне нужно изменить размер массива (без векторов). Я читал об этом вопросе во всех переполнениях стека, но ответы, похоже, не применимы ко мне, потому что мне нужны данные из старого массива, скопированного в новый массив. Кроме того, если я создаю новый массив большего размера внутри метода, а затем скопирую данные в новый массив, как только метод закончится, массив исчезнет, ​​но мне снова понадобится глобальная переменная, поэтому все мои методы может это увидеть ... Как мне продолжить? Спасибо

+0

Почему вы не хотите использовать' станд :: VECTOR' –

+0

Почему? „Без векторов“ Во всяком случае, не использовать глобальные переменные Они [Зла ™ ] (http://stackoverflow.com/a/485020/464581). –

+0

Это для проекта, нам не разрешено использовать векторы. Без глобальной переменной я не знаю, как я смогу использовать массив во всех моих функциях. – Chris

ответ

0

Память, выделенная new, не исчезнет после завершения вашего метода.

Вы можете вернуть указатель на новый массив по ссылке usung: void f(int *&ptr, size_t &size).

Кроме того, имейте в виду, что вам необходимо очистить память вручную, вы используете ее. Например:

int* newArray = new int[newSize]; 
... copying from old array ... 
int* temp = oldArray; 
oldArray = newArray; 
delete[] temp; 
2

Чтобы изменить размер массива вы должны выделить новый массив и копировать старые элементы в новый массив, а затем удалить старый массив.

T * p_bag; 
p_bag = new T[old_size]; 
//... 
T * p_expanded_bag = new T[new_size]; 
for (unsigned int i = 0; i < old_size; ++i) 
{ 
    p_expanded_bag[i] = p_bag[i]; 
} 
delete[] p_bag; 
p_bag = p_expanded_bag; 

Вы можете использовать std::copy вместо петли for.

+0

Если я это сделаю, не будет ли вновь созданный массив локальной переменной метода, не позволяя мне использовать массив в других методах? – Chris

+1

Указатель массива должен быть доступен и иметь атрибуты чтения/записи. Если этот код находится в свободной стоячей функции, вы должны передать указатель по ссылке. Если вы создаете свой собственный класс 'std :: vector', то указатель должен быть членом данных, а функция - методом внутри класса. –

0

thing вам нужно можно сделать следующие вещи

  • Автоматически обрабатывать изменение размера, когда запрашиваемый размер больше, чем текущий размер массива.

  • При изменении размера они могут копировать исходный контент в новое пространство, а затем сразу же отказаться от старого выделения.

  • Существует механизм с не-глобальным переменным, который позволяет отслеживать указатель массива и текущий размер.

thing очень похож на std::vector. Если это не разрешено использовать, вам может понадобиться manage a dynamic allocated resource, как std::vector по своему усмотрению. Вы можете ссылаться на реализацию в этой ответной ссылке.

Если в конце концов, вам нужно обернуть его в классе, убедитесь, что следовать за большие 3 правила (5 правил в C++ 11)

-1

Вы можете использовать перераспределить из с, если у вас есть массив символов/Интс/удваивает ... или какой-либо другой фундаментальный тип данных или классы только с этими переменными (например, массив строк не будет работать). http://www.cplusplus.com/reference/cstdlib/realloc/

bag = (T*) realloc(bag, new_size * sizeof(T)); 

Realloc автоматически выделять место для нового массива (возможно, в то же место в памяти) и скопировать все данные из данного массива. «Содержимое блока памяти сохраняется до меньшего размера нового и старого размера, даже если блок перемещается в новое место."

Пример:

#include <stdio.h>  /* printf*/ 
#include <stdlib.h>  /* realloc, free */ 

#include <iostream> 

int main() 
{ 
    int old_size = 5; 
    int new_size = 10; 

    int *array = new int[old_size]; 

    printf("Old array\n"); 
    for (int i=0; i<old_size; i++) { 
     array[i] = i; 
     printf("%d ", array[i]); 
    } 
    printf("\nArray address: %d\n", array); 

    array = (int*) realloc(array, new_size * sizeof(int)); 

    printf("New array\n"); 
    for (int i=0; i<new_size; i++) 
     printf("%d ", array[i]); 
    printf("\nArray address: %d\n", array); 

    free(array); 
    return 0; 
} 
+2

Функция 'realloc' не вызывает конструкторы типа' operator new'. Плохой выбор. –