Форум программистов, компьютерный форум CyberForum.ru

как расширить массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.90
Garret192
 Аватар для Garret192
1 / 1 / 0
Регистрация: 21.10.2009
Сообщений: 84
20.02.2010, 20:49     как расширить массив #1
Привет.Как правильно расширить массив.
Например.
У меня есть массив и я вывел все отрицательные элемены как их вставить после ну допустим второго элемента.
PS Массив не динамический.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,423
20.02.2010, 20:55     как расширить массив #2
К сожалению никакой массив расширить нельзя, даже динамический... может это такой прием речи - динамический, но на самом то деле придется память выделять совсем в другом месте, а предыдущую туда копировать и освобождать. В общем если у вас было 10 бубликов и тележка для 10 бубликов а потом стало нужно вместить 11 бубликов никакого выхода кроме заводить новую тележку лично я не вижу Или я не прав?...
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
20.02.2010, 21:46     как расширить массив #3
Если массив не динамический, можно только сразу задать его необходимого объема
Например, исходный массив - 10 чисел, а ты пишешь
int M[40];
И в пределах этих 40 - делай чего хочешь - эта память твоя.
Для динамического делается так:
int *M;
M = (int *)malloc(10*sizeof(int));
......
Выяснилось, что нужно 15 элементов:
M = (int *)realloc(M, 15*sizeof(int));
Первые 10 элементов нового массива будут те же, что и в старом M,
остальные 5 - не определены, т.е. в них какой-то мусор, но смело их можешь заполнять.

ЗЫ: Не забудь вставить #include <alloc.h>
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.02.2010, 21:49     как расширить массив #4
А в С++ лучше один из контейнеров использовать (vector, list, set, etc.. их много) и голову себе такими вещами не забивать
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
20.02.2010, 22:02     как расширить массив #5
К сожалению никакой массив расширить нельзя, даже динамический
все правильно, выделяй массив большего размера, копируй туда старый, только не забудь удалить его)
insideone
20.02.2010, 22:38
  #6

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
А в С++ лучше один из контейнеров использовать (vector, list, set, etc.. их много) и голову себе такими вещами не забивать
http://www.gamedev.ru/code/articles/?id=4228 всегда ли?
Результаты теста показывают, что полученный список работает на порядок быстрее (до 30 раз) чем стандартный при операциях вставки и удаления элементов и до 4х раз быстрее при перемещении по списку.
30 раз это как уже серьёзно, вам не кажется?

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.02.2010, 22:56     как расширить массив #7
Цитата Сообщение от insideone Посмотреть сообщение
30 раз это как уже серьёзно, вам не кажется?
не, контейнер list, как супербыстрый, никогда и не позиционировался... Велосипед там, конечно, серьёзный смастерили, только stl на контейнере list не заканчивается. Если нужно в начало очереди объекты вставлять, имеется двухсторонняя очередь - deque. Для быстрого доступа к произвольному из уникальных упорядоченных объектов - set... Да к тому же, чисто игрушечная тактика - отхватить сразу три версты памяти, а потом по ней шустро перемещаться...
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
20.02.2010, 22:57     как расширить массив #8
все правильно, выделяй массив большего размера, копируй туда старый, только не забудь удалить его)
realloc сам все скопирует.
Но твой подход тоже верен
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
20.02.2010, 23:06     как расширить массив #9
ага, пусть суть поймет!)
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,423
20.02.2010, 23:07     как расширить массив #10
Цитата Сообщение от easybudda Посмотреть сообщение
не, контейнер list, как супербыстрый, никогда и не позиционировался... Велосипед там, конечно, серьёзный смастерили, только stl на контейнере list не заканчивается. Если нужно в начало очереди объекты вставлять, имеется двухсторонняя очередь - deque. Для быстрого доступа к произвольному из уникальных упорядоченных объектов - set... Да к тому же, чисто игрушечная тактика - отхватить сразу три версты памяти, а потом по ней шустро перемещаться...
STL мне щас представляется как большой паровоз на котором можно хорошо кататься если знаешь где рулить. А до тех пор только толкать его можно, и выходит медленно. Спасибо за информацию не знал. Жаль так мало свободного времени, надо почитать какие нибудь момументальные труды про него, правда боюсь они толстые(

2 Day. А для new - delete же такого нет? Я просто ими всегда пользовался... Немного запутывает меня такая вариативость выделения ресурсов.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.02.2010, 23:14     как расширить массив #11
insideone, я до недавнего времени практически всё на С писал, а на С++ подсел по прочтении книжки "Стандартная библиотека С++ на примерах" Пабло Халперн. Книжка тоненькая - с собой носить можно... Особо в детали там, правда, не вдаются, но общее представление про всю эту кухню получить можно. Для типовых задач, не требующих мега-скорости, или фанатичной экономии памяти очень удобно и экономит массу времени. А тонкости можно в справочниках почитать - MSDN например, или мне вот больше www.cplusplus.com нравится...
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
20.02.2010, 23:17     как расширить массив #12
А для new - delete же такого нет? Я просто ими всегда пользовался... Немного запутывает меня такая вариативость выделения ресурсов
а разве realloc не работает?

какая вариативность, компилятор вместо new и delete подставит malloc и free если я не ошибаюсь
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,423
20.02.2010, 23:23     как расширить массив #13
Цитата Сообщение от DeadRipper Посмотреть сообщение
а разве realloc не работает?
На самом деле в книге Скотта Майерса где 50 советов я читал что смещивать пары new - delete, malloc - free очень неправильно. Я вообще пользовался всегда только new - delete поэтому совет как то мимо ушей пролетел, а книги щас под рукой нет чтобы мог процитировать.

Нет, ну даже просто если подумать... Если память после массива в 10 элементов уже чем то занята? Как поступит realloc? Если "добавить" некуда... выделит и скопирует? Ну тогда в принципе то же самое что и new - delete
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
20.02.2010, 23:25     как расширить массив #14
2 Day. А для new - delete же такого нет? Я просто ими всегда пользовался... Немного запутывает меня такая вариативость выделения ресурсов.
Не, я такого не слыхал. ReNew, да?
Но впрочем, realloc делает почти в точности то, что говорит DeadRipper, просто функция такая.
Никто не мешает тебе сделать такое
Код
ReNew(X, n) {
   Y = new .. [n];
   // Перепись X -> Y
   delete X
   return Y;
}
Только там чего-то с типами будет, наверное, шаблоны надо применить, я в этом не силен.
А вариатативность... Да бог с ней! Привык к new - delete - и ладушки
У new еще и конструктор-деструктор есть, т.е. местами без него - никак.
Мне когда просто память нужна - malloc, а уж ежели объект с инициализациями всякими -
тогда уж - new. Но это все - дело привычки
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.02.2010, 23:32     как расширить массив #15
Цитата Сообщение от insideone Посмотреть сообщение
Как поступит realloc? Если "добавить" некуда... выделит и скопирует?
Оставит, как было. А по поводу не смешивать new/delete и malloc/free - очень правильный совет!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2010, 23:48     как расширить массив
Еще ссылки по теме:

C++ Как расширить класс в С++?
Как расширить длину строки до определённого значения? C++
Расширить консольное окно до полного экрана C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
20.02.2010, 23:48     как расширить массив #16
easybudda,
Оставит, как было.
А не выдаст ли NULL ? (но старое оставит!)
Для программы это все равно почти всегда означает конец нормальной работы.
Если тебе нужна память, а ее нету - все, сматывай удочки, ищи ошибку, меняй алгоритм!
А если можно по сусекам еще памяти наскрести - то где ты был раньше?
Yandex
Объявления
20.02.2010, 23:48     как расширить массив
Ответ Создать тему
Опции темы

Текущее время: 21:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru