Как развернуть массив динамично в C++? {Как в векторе}

Я мог жить без него? Легко.

это полезный? Да.

Причины Изучения

  • vi, как гарантируют, будет существовать во всех системах Unix и существует на большинстве Linux также. Такое широкое покрытие делает изучение его стоящим того.

  • Это намного более быстро для использования vi для sudo редактирование:

    $ sudo vi

  • кроме того, Gmail использует команды vi-выхода для выбора & перемещение электронных писем!

Вы не должны быть ведущим устройством.

Просто учатся

основы:

  • , Как переключить от командного режима до режима вставки меня
  • , Как переключиться от режима вставки до командного режима Esc
  • , Как переместиться по строке в командном режиме k
  • , Как переместиться вниз по строке в командном режиме j
  • , Как перейти оставленный символ в командном режиме h
  • , Как перейти, исправляют символ l
  • , Как сохранить файл :w , Входят (запись)
  • , Как выйти, не сохраняя (в командном режиме) :q! , Вводят
  • , Как Отменить u
  • , Как Восстановить Ctrl + r
  • , можно объединить запись и выход (в командном режиме): :wq Вводят

Оттуда, остальные просто сделают Вас быстрее.

13
задан Jesse Beder 29 August 2009 в 06:20
поделиться

5 ответов

Вы должны перераспределить массив и скопировать данные:

int *p;
p = new int[5];
for(int i=0;i<5;i++)
   *(p+i)=i;

// realloc
int* temp = new int[6];
std::copy(p, p + 5, temp); // Suggested by comments from Nick and Bojan
delete [] p;
p = temp;
26
ответ дан 1 December 2019 в 18:55
поделиться

Вы не можете. Для этого вы должны использовать динамический контейнер, такой как вектор STL. Или вы можете создать другой массив большего размера, а затем скопировать в него данные из вашего первого массива.

Причина в том, что массив представляет собой непрерывную область памяти. В приведенном выше примере допустим, что p указывает на адрес 0x1000, а пять целых чисел соответствуют двадцати байтам, поэтому массив заканчивается на границе 0x1014. Компилятор может помещать в память другие переменные, начиная с 0x1014; например, int i может занимать 0x1014..0x1018. Что произойдет, если затем вы расширите массив так, чтобы он занимал еще четыре байта?

8
ответ дан 1 December 2019 в 18:55
поделиться

Если вы выделяете начальный буфер с помощью malloc , вы можете использовать realloc для изменения размера буфера. Вы не должны использовать realloc для изменения размера нового -ed буфера.

int * array = (int*)malloc(sizeof(int) * arrayLength);
array = (int*)realloc(array, sizeof(int) * newLength);

Тем не менее, это стиль Си. Вам следует рассмотреть возможность использования вектора .

3
ответ дан 1 December 2019 в 18:55
поделиться

Почему бы вам не посмотреть в источниках, как vector делает это? Вы можете увидеть реализацию этого механизма прямо в папке, в которой находятся ваши включаемые файлы C ++!

Вот что он делает в gcc 4.3.2:

  1. Выделяет новый непрерывный кусок памяти с помощью распределителя вектора (вы помните этот вектор - вектор ?). Распределитель по умолчанию вызывает оператор new () (не только new !) Для выделения этого фрагмента, позволяя себе таким образом не связываться с new [] / ] delete [] stuff;

  2. Скопируйте содержимое существующего массива в новый выделенный массив

  3. Удалите ранее выровненный фрагмент с помощью распределителя; по умолчанию используется оператор delete () .

(Примечание. что если вы собираетесь написать свой собственный вектор, ваш размер должен увеличиваться «в M раз», а не «на фиксированную величину». Это позволит вам получить амортизированное постоянное время. Например, если при каждом превышении лимита размера ваш вектор увеличивается вдвое, каждый элемент будет скопирован в среднем один раз.)

2
ответ дан 1 December 2019 в 18:55
поделиться

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

1
ответ дан 1 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: