![]() |
|
Модераторы: 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) можно использовать стандартный:
писал тут, проверь |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |