Я мог жить без него? Легко.
это полезный? Да.
vi, как гарантируют, будет существовать во всех системах Unix и существует на большинстве Linux также. Такое широкое покрытие делает изучение его стоящим того.
Это намного более быстро для использования vi для sudo
редактирование:
$ sudo vi
кроме того, Gmail использует команды vi-выхода для выбора & перемещение электронных писем!
Вы не должны быть ведущим устройством.
Просто учатся
:w
, Входят (запись) :q!
, Вводят :wq
Вводят Оттуда, остальные просто сделают Вас быстрее.
Вы должны перераспределить массив и скопировать данные:
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;
Вы не можете. Для этого вы должны использовать динамический контейнер, такой как вектор STL. Или вы можете создать другой массив большего размера, а затем скопировать в него данные из вашего первого массива.
Причина в том, что массив представляет собой непрерывную область памяти. В приведенном выше примере допустим, что p указывает на адрес 0x1000, а пять целых чисел соответствуют двадцати байтам, поэтому массив заканчивается на границе 0x1014. Компилятор может помещать в память другие переменные, начиная с 0x1014; например, int i
может занимать 0x1014..0x1018. Что произойдет, если затем вы расширите массив так, чтобы он занимал еще четыре байта?
Если вы выделяете начальный буфер с помощью malloc
, вы можете использовать realloc
для изменения размера буфера. Вы не должны использовать realloc
для изменения размера нового
-ed буфера.
int * array = (int*)malloc(sizeof(int) * arrayLength);
array = (int*)realloc(array, sizeof(int) * newLength);
Тем не менее, это стиль Си. Вам следует рассмотреть возможность использования вектора
.
Почему бы вам не посмотреть в источниках, как vector
делает это? Вы можете увидеть реализацию этого механизма прямо в папке, в которой находятся ваши включаемые файлы C ++!
Вот что он делает в gcc 4.3.2:
Выделяет новый непрерывный кусок памяти с помощью распределителя вектора (вы помните этот вектор - вектор
?). Распределитель по умолчанию вызывает оператор new ()
(не только new
!) Для выделения этого фрагмента, позволяя себе таким образом не связываться с new []
/ ] delete []
stuff;
Скопируйте содержимое существующего массива в новый выделенный массив
Удалите ранее выровненный фрагмент с помощью распределителя; по умолчанию используется оператор delete ()
.
(Примечание. что если вы собираетесь написать свой собственный вектор, ваш размер должен увеличиваться «в M раз», а не «на фиксированную величину». Это позволит вам получить амортизированное постоянное время. Например, если при каждом превышении лимита размера ваш вектор увеличивается вдвое, каждый элемент будет скопирован в среднем один раз.)
То же, что и другие, но если вы часто изменяете размер массива, одна из стратегий состоит в том, чтобы каждый раз изменять размер массива, удваивая размер. Постоянное создание нового и уничтожение старого требует затрат, поэтому теория удвоения пытается смягчить эту проблему, обеспечивая достаточно места для будущих элементов.