![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Помогите с динамическим массивом...
Есть код:
В этом коде создается динамический массив объектов класса Object. Затем в цикле устанавливаются значения переменных. Затем создается переменная x и идет запрос на ввод. Мне нужно следущее: если x = 1, то создается новый объект enemy класса Object (Т.е. enemy_n становиться равным 5)... Другими словами, в конец массива объектов должен добавляться новый. Как переписать код, чтобы это было возможным... И еще маленький вопрос: Если я удалю enemy[1], то как сместить другие объекты массива вверх? Есть идея взять последний элемент и вставить его на место удаленного... |
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: нет Всего: 40 |
создай новый массив [enemy_n+1] размера, в него запиши предидущий массив и удали предидущий. -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
используйте std::vector (#include <vector>)
например так :
Это сообщение отредактировал(а) mes - 27.10.2008, 23:32 |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
Не по теме, но будет лучше, если заменить красный код на зеленый
for(int i; i<4; i++) for(int i=0; i<4; i++) cin > x; cin>>x; |
|||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Coder, писал просто в блокноте, торопился => ошибся.
Буду учить вектора... |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
RaP1D, зачем сразу вектора?
А разобраться, как это делается без них: 1. Создать новый массив размером [enemy_n], где enemy_n уже = 5 2. Скопировать из старого массива в новый 4 первых элемента 3. Проиницализировать в 5-й элемент. 4. Убить старый [0..4] массив. |
|||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Coder
Да уж, вектора мне не очень то и подходят... Просто я делаю игру, так вот, при 2500 объектах класса было 860 FPS, а с векторами FPS упало до 200 А как со скоростью твоего метода? В принципе я и хотел попробовать что-то такое... |
|||
|
||||
| J0ker |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
а не рановато?
любым инструментом надо уметь пользоваться
vector так и делает но у него есть специальные фичи, для заточки под конкретную задачу например reserve и кастом аллокатор и потом есть другие контейнеры, которые возможно подойдут под вашу задачу гораздо лучше Добавлено через 1 минуту и 36 секунд ну разве что только для этого по другому поводу глупо осложнять себе жизнь изобретением велосипеда с квадратными колесами |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну да зачем лопата, давайте будем рыть яму под фундамент руками, вместо того, чтоб научиться пользоваться достижениями цивилизации
не верю © К.С. Станисла́вский сам вектор тут не причем, на лицо неправильное использование инструмента. |
|||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
mes, и вправду, после компилирования в Release fps падает до 200 при 11000 объектов...
А вектора вобще cильно нагружают систему? Это тежи динамические массивы? А память как освобождать? И еще вопрос: допусти создано 12 объектов 1 класса. Я удаляю 5 объект (кстати как это сделать?). Как сместить все оставшиеся объекты вниз (т.е. было 12, стало 11)? Это сообщение отредактировал(а) RaP1D - 28.10.2008, 19:34 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вектор это обертка над динамическим масивом, с автоматическим выделением, перераспределением и удалением памяти. Помимо этого предоставляет средства для ручной корректировки поведения. При правильном использовании вес использования такой же как и у обычного динамического массива. К примеру если Вы видете что сейчас будет добавлено n-oe кол-во элементов, то лучше заранее попросить вектора заготовить себе памяти впрок для них, а не добавлять по одному. Т.е те же самые действия что Вы делали бы вы вручнуюс кучей кода, с вектором (и другими стл-подобными контейнерами) решаются просто путем указания ему нужного поведения. |
|||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
mes, спасибо!!
А как узнать сколько памяти выделяется под вектор? sizeof(enemy) показывает всегда одно и тоже число - быть может он считает только 1 элемент массива? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
enemy.size () http://www.firststeps.ru/mfc/stl/ Это сообщение отредактировал(а) mes - 29.10.2008, 00:29 |
|||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
mes, мм, нет enemy.size() указывает сколько элементов в массиве создано...
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
RaP1D, что-то мне подсказывает, что тебе требуется
1. динамически добавлять и удалять объекты в контейнер 2. осуществлять к ним последовательный доступ (перебор) если так, объекты лучше хранить в связном списке. для списков операции добавления/удаления имеют порядок роста O(1) можно использовать стандартный:
писал тут, проверь |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
интересует под сколько элементов памяти уже выделено ? capacity вот цитата из приведенной вышее ссылки : (http://www.firststeps.ru/mfc/stl/
Это сообщение отредактировал(а) mes - 29.10.2008, 12:54 |
||||
|
|||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Еще вопрос:
Есть вектор, состоящий из 100 объектов. Я добавляю туда еще 500. Затем удаляю 300 элементов. Но память не освобождается. Так и должно быть? А в list тоже также? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
в list освобождается
в vector нет, она будет использована при последующих добавлениях. принудительно освободить память можно при помощи resize() |
|||
|
||||
| RaP1D |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Не кидайте в меня тапком, решил создать вручную функцию для увеличения размера массива, так сказать для интереса... И столкнулся с проблемой.
В AddObject передается адрес на объект, затем там с ним шаманят, затем этот объект удаляется (delete [] a;) и должен создаться такой же (a = new Object [num_obj+1];)... Код компилируется, вроде работает, но при завершении программы вылетают ошибки... Я уверен, что ошибка кроется в:
т.к., если писать:
то все ОК... Как исправить функцию, чтобы она корректно работала? |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
|
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
RaP1D, я те ответственно заявляю - быстрее и, что самое главное, прямее STL ты не сделаешь
ты уже понял, как работают динамические массивы переходи на STL - разберись с аллокатором и будет те щасте |
|||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
mes, не, не работает
Может я неправильно вызываю функцию? Это сообщение отредактировал(а) RaP1D - 31.10.2008, 09:17 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет я написал неверно...sorry ... вот подправил :
Это сообщение отредактировал(а) mes - 31.10.2008, 16:12 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
RaP1D, более полезно и удобно создать класс-контейнер, который будет иметь соотв. операции, типа:
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
осталось дополнить функциональностью и получится стл-контейнер, который в отличие от самописного готов , проверен и имеет вдовавок кучу алгоритмов. ) Это сообщение отредактировал(а) mes - 31.10.2008, 18:07 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
согласен. но человек тренируется и учится, надо помочь ему.
я тут вот еще чуть набросал. идея такая: функций operator [] и Resize() в принципе достаточно для реализации удаления/добавления без доступа к устройству класса ObjectArray. Поэтому на его базе можно создать нечто вроде PowerObjectArray, который реализует требуемый функционал, не обращаясь к структурам ObjectArray напрямую.
Если реализация ObjectArray изменится, например он перестанет вести себя прямолинейно и перераспределять память при каждом чихе, PowerObjectArray менять не придется. RaP1D, посмотри, но имей в виду, что это только для понимания концепций и тренировки. для применения в реальных полезных программах есть стандартные контейнеры vector, list и т.д. |
|||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
baldina,
mes, Большущее спасибо!!! О-ба-на... При использовании вектора показывает 200FPS при 3000 объектах, а при использовании самописной функции 604FPS при 3000 объектах!!! Это сообщение отредактировал(а) RaP1D - 31.10.2008, 21:47 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
ага, и скажи заодно какой компилятор и с какими опциями компиляешь.
кстати, заодно, сколько FPS при отсутствии объектов? ;) Добавлено через 4 минуты и 2 секунды RaP1D, разницы не должно быть, если ты прост отображаешь свои 3000. разница во вставке/удалении и, поверь, не в пользу самописных. так что если простой доступ у тебя к vector в 3 раза медленнее, чем к твоему массиву, то либо неправильно используется vector, либо это накладные debug конфигурации. |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
| RaP1D |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Мдя, поторопился я - при компиляции в Release кадров примерно одинаково...
При отсутствии объектов 1000 кадров... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |