Форум: Форум C++Разное
Новые темы: 00
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Динамическое изменение размера массива
 
 автор: in_mysql   (08.01.2007 в 16:51)
 
 

Как можно динамически увеличить размер массива, допустим объявляем массив из 10 элементов int
int *prt = new int[10];

Допустим, потребовалось увеличить его размер ещё на 20 элементов, как это сделать?

  Ответить  
 
 автор: Sergey89   (08.01.2007 в 18:05)   письмо автору
 
   для: in_mysql   (08.01.2007 в 16:51)
 

Никак. Надо юзать STL, шаблон list или vector.

  Ответить  
 
 автор: Евгений Петров   (08.01.2007 в 20:06)   письмо автору
 
   для: in_mysql   (08.01.2007 в 16:51)
 

void main(void)
{
int * prt = new int[10];
int * pTmp = new int[20];
for(int i = 0; i < 10; i++)
{
pTmp[i] = prt[i];
}
delete[] prt;
prt = pTmp;
}

  Ответить  
 
 автор: cheops   (08.01.2007 в 23:36)   письмо автору
 
   для: in_mysql   (08.01.2007 в 16:51)
 

Конструкция массива гарантирует, что его элементы располагаются друг подле друга, чтобы можно было передвигаться вдоль массива при помощи указателя. Когда вы объявляется массив из 10 элементов int для него подыскивается соответствующий кусок свободной памяти. Однако это не факт, что вслед за ним будут свободный кусок, чтобы к нему можно было добавить ещё элементов. Поэтому процедура увеличения объёма массива заключается в выделении нового объёма памяти равного конечному объёму массива, копированию туда старых элементов и уничтожению старого объёма памяти (STL по отношению к векторам, кстати, действует точно также) - пример приведён в посте Евгения Петрова. Это достаточно дорогостоящая операция (вообще выделение и освобождение памяти всегда дорого обходится), поэтому если приращение памяти производится часто, лучше прибегнуть к другим конструкциям, например, двухсвязному списку - его элементы могут находиться в памяти где попало, так как связаны друг с другом указателями.

  Ответить  
 
 автор: Евгений Петров   (08.01.2007 в 23:40)   письмо автору
 
   для: cheops   (08.01.2007 в 23:36)
 

Или как вариант можно резервировать заранее чуть больше памяти чем нужно. А потом просто убрать лишку... Это иногда удобно, когда нужен доступ по индексу. Обращение к элементу массива происходит быстрее чем к элементу списка, т.к. в списке переход осуществляется через краевые элементы путем перехода по указателям.

  Ответить  
 
 автор: Евгений Петров   (08.01.2007 в 23:40)   письмо автору
 
   для: cheops   (08.01.2007 в 23:36)
 

Кстати а можно ли проверить свободен ли участок памяти после массива?

  Ответить  
 
 автор: cheops   (09.01.2007 в 00:00)   письмо автору
 
   для: Евгений Петров   (08.01.2007 в 23:40)
 

В рамках языка (т.е. переносимо на разные платформы) нет, да и так затрудняюсь с ответом... лучше распределение памяти отдавать на откуп системы - и без этого проблем хватает :)))

  Ответить  
 
 автор: ssdmt   (18.01.2007 в 15:08)   письмо автору
 
   для: Евгений Петров   (08.01.2007 в 23:40)
 

вообще правильно сказано было .. да и практика показывает что так выгоднее(по времени и надёжности) отдавать работу с памятью операционке ...
а за массивом посмотреть память нельзя, можно только за конкретным элементом массива :) (например за последним) только иногда это может привести к ошибке :) ... при доступе к памяти(тут поможет тока механизм исключений)

int a[10];

а вот вам и содержимое байта за последним элементом:
cout << *(&a[9] +1);

сам адрес вот:
cout << &a[9]+1;


это моё мнение .. может и не так .. :)

  Ответить  
 
 автор: in_mysql   (09.01.2007 в 14:27)
 
   для: in_mysql   (08.01.2007 в 16:51)
 

Всем спасибо!

  Ответить  
 
 автор: ssdmt   (18.01.2007 в 15:07)   письмо автору
 
   для: in_mysql   (09.01.2007 в 14:27)
 

да пожалуйста :)

  Ответить  
 
 автор: dezziness   (21.01.2007 в 18:30)
 
   для: in_mysql   (08.01.2007 в 16:51)
 

int *prt = new int[10];
delete [ ] prt;
prt= new int [30];

  Ответить  
 
 автор: cheops   (21.01.2007 в 21:41)   письмо автору
 
   для: dezziness   (21.01.2007 в 18:30)
 

Только при таком подходе следует учитывать, что ранее записанные в массив int[10] данные удаляются, при выполнении оператора delete [] и массив int[30] будет чист.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования