Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.90
Garret192
1 / 1 / 0
Регистрация: 21.10.2009
Сообщений: 84
#1

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

20.02.2010, 20:49. Просмотров 6211. Ответов 15
Метки нет (Все метки)

Привет.Как правильно расширить массив.
Например.
У меня есть массив и я вывел все отрицательные элемены как их вставить после ну допустим второго элемента.
PS Массив не динамический.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2010, 20:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как расширить массив (C++):

Свой класс вектор. Как расширить динамический массив - C++
#include <iostream> using namespace std; template<typename T> class Vector { private: int current; int* m; int...

Расширить динамический массив - C++
Есть програмка в которой можно внести даные про оформленые заявки на оренду машин. Каждая заявка ето обьект класа tz, Масив заявок...

Расширить массив из цифр - C++
Нужно расширить старый массив чисел, из 4х чисел должно получиться 6 (берем входной блок из 4х чисел и дописываем к нему по одному...

Как расширить класс в С++? - C++
Требуется добавить в класс метод, не добавляя его в описание класса.Пример - библиотека <algorithm>. То есть есть у нас, скажем, файл типа...

Как расширить строку - C++
Всем привет. Нужно расширить строку exstr до 48, но как только выхожу за 32 то пишет что я выхожу за пределы. Как быть в данной ситуации? ...

Как расширить окно консоли - C++
какой командой можно расширить окно консоли?а то у меня прога много выводит,и начало ,не с начала начинается,а где-то с центра самой...

15
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
20.02.2010, 20:55 #2
К сожалению никакой массив расширить нельзя, даже динамический... может это такой прием речи - динамический, но на самом то деле придется память выделять совсем в другом месте, а предыдущую туда копировать и освобождать. В общем если у вас было 10 бубликов и тележка для 10 бубликов а потом стало нужно вместить 11 бубликов никакого выхода кроме заводить новую тележку лично я не вижу Или я не прав?...
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
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>
2
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
20.02.2010, 21:49 #4
А в С++ лучше один из контейнеров использовать (vector, list, set, etc.. их много) и голову себе такими вещами не забивать
2
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
20.02.2010, 22:02 #5
К сожалению никакой массив расширить нельзя, даже динамический
все правильно, выделяй массив большего размера, копируй туда старый, только не забудь удалить его)
0
insideone
20.02.2010, 22:38
  #6

Не по теме:

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

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

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

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

Нет, ну даже просто если подумать... Если память после массива в 10 элементов уже чем то занята? Как поступит realloc? Если "добавить" некуда... выделит и скопирует? Ну тогда в принципе то же самое что и new - delete
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
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. Но это все - дело привычки
1
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
20.02.2010, 23:32 #15
Цитата Сообщение от insideone Посмотреть сообщение
Как поступит realloc? Если "добавить" некуда... выделит и скопирует?
Оставит, как было. А по поводу не смешивать new/delete и malloc/free - очень правильный совет!
0
20.02.2010, 23:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2010, 23:32
Привет! Вот еще темы с ответами:

Как расширить работоспособность программы - C++
Подскажите пожалуйста как сделать так чтобы программа работала при бОльших значениях...Вот у меня имеется программа для рекурсивного...

Как расширить консольное окно - C++
Как расширить консольное окно, скажем на весь экран его растянуть

Как расширить длину строки до определённого значения? - C++
Подскажите,как расширить длину строки до определённого значения.

Как можно расширить STL своим набором функций? - C++
За предисловие сгодится то что я запорол контест из-за того, что юзал STL типа a.find(b) != string::npos Когда нормальные решения были...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru