Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с динамическим массивом объектов 
:(
    Опции темы
RaP1D
Дата 27.10.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



Помогите с динамическим массивом...

Есть код:
Код

#include <iostream>
using namespace std

class Object
{
public:
    int x;
    int y;
};

int main(int argc, char* argv[])
{
    int enemy_n = 4;
    Object *enemy = new Object [enemy_n];

    for(int i; i<4; i++)
    {
        enemy[i].x = i;
        enemy[i].y = i;
    }

    int x;
    cin > x;
    if(x == 1) ???
}


В этом коде создается динамический массив объектов класса Object. Затем в цикле устанавливаются значения переменных. Затем создается переменная x и идет запрос на ввод.

Мне нужно следущее: если x = 1, то создается новый объект enemy класса Object (Т.е. enemy_n становиться равным 5)... Другими словами, в конец массива объектов должен добавляться новый.

Как переписать код, чтобы это было возможным...

И еще маленький вопрос:
Если я удалю enemy[1], то как сместить другие объекты массива вверх? Есть идея взять последний элемент и вставить его на место удаленного...
PM MAIL   Вверх
IKM2007
Дата 27.10.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: нет
Всего: 40



Цитата(RaP1D @  27.10.2008,  22:46 Найти цитируемый пост)
Как переписать код, чтобы это было возможным...

создай новый массив [enemy_n+1] размера, в него запиши предидущий массив и удали предидущий.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 27.10.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



используйте std::vector (#include <vector>)
например так :
Код

  int enemy_n = 4;
  std::vector<Object> enemy;
  enemy.resize[enemy_n];

    for(int i; i<enemy_n; i++)
    {
        enemy[i].x = i;
        enemy[i].y = i;
    }
    int x;
    cin >> x;
    if(x == 1) enemy.push_back(Object());




Это сообщение отредактировал(а) mes - 27.10.2008, 23:32


--------------------
PM MAIL WWW   Вверх
Coder
Дата 28.10.2008, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Не по теме, но будет лучше, если заменить красный код на зеленый  smile 

for(int i; i<4; i++)
for(int i=0; i<4; i++)

cin > x;
cin>>x;
PM MAIL   Вверх
RaP1D
Дата 28.10.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



Coder, писал просто в блокноте, торопился => ошибся.

Буду учить вектора...
PM MAIL   Вверх
Coder
Дата 28.10.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



RaP1D, зачем сразу вектора?  smile 

А разобраться, как это делается без них:
1. Создать новый массив размером [enemy_n], где enemy_n уже = 5
2. Скопировать из старого массива в новый 4 первых элемента
3. Проиницализировать в 5-й элемент.
4. Убить старый [0..4] массив.


PM MAIL   Вверх
RaP1D
Дата 28.10.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



Coder
Да уж, вектора мне не очень то и подходят...

Просто я делаю игру, так вот, при 2500 объектах класса было 860 FPS, а с векторами FPS упало до 200 smile 

А как со скоростью твоего метода? В принципе я и хотел попробовать что-то такое...
PM MAIL   Вверх
J0ker
Дата 28.10.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(RaP1D @  28.10.2008,  15:59 Найти цитируемый пост)
Просто я делаю игру

а не рановато?  smile 

Цитата(RaP1D @  28.10.2008,  15:59 Найти цитируемый пост)
так вот, при 2500 объектах класса было 860 FPS, а с векторами FPS упало до 200

любым инструментом надо уметь пользоваться

Цитата(RaP1D @  28.10.2008,  15:59 Найти цитируемый пост)
А как со скоростью твоего метода? В принципе я и хотел попробовать что-то такое... 

vector так и делает
но у него есть специальные фичи, для заточки под конкретную задачу
например reserve и кастом аллокатор
и потом есть другие контейнеры, которые возможно подойдут под вашу задачу гораздо лучше

Добавлено через 1 минуту и 36 секунд
Цитата(Coder @  28.10.2008,  11:11 Найти цитируемый пост)
А разобраться, как это делается без них

ну разве что только для этого
по другому поводу глупо осложнять себе жизнь изобретением велосипеда с квадратными колесами  smile 


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 28.10.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Coder @  28.10.2008,  11:11 Найти цитируемый пост)
RaP1D, зачем сразу вектора?  smile 

ну да зачем лопата, давайте будем рыть яму под фундамент руками, вместо того, чтоб научиться пользоваться достижениями цивилизации  smile 

Цитата(RaP1D @  28.10.2008,  15:59 Найти цитируемый пост)
Просто я делаю игру, так вот, при 2500 объектах класса было 860 FPS, а с векторами FPS упало до 200 smile 

не верю © К.С. Станисла́вский
сам вектор тут не причем, на лицо неправильное использование инструмента.



--------------------
PM MAIL WWW   Вверх
RaP1D
Дата 28.10.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



mes, и вправду, после компилирования в Release fps падает до 200 при 11000 объектов...

А вектора вобще cильно нагружают систему? Это тежи динамические массивы? А память как освобождать?

И еще вопрос: допусти создано 12 объектов 1 класса. Я удаляю  5 объект (кстати как это сделать?). Как сместить все оставшиеся объекты вниз (т.е. было 12, стало 11)?

Это сообщение отредактировал(а) RaP1D - 28.10.2008, 19:34
PM MAIL   Вверх
mes
Дата 28.10.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(RaP1D @  28.10.2008,  19:27 Найти цитируемый пост)
А вектора вобще cильно нагружают систему? Это тежи динамические массивы? А память как освобождать?

вектор это обертка над динамическим масивом, с автоматическим выделением, перераспределением и удалением памяти.
Помимо этого предоставляет средства для  ручной корректировки поведения. 
При правильном использовании вес использования такой же как и у обычного динамического массива. 
К примеру если Вы видете что сейчас будет добавлено n-oe кол-во элементов, то лучше заранее попросить вектора заготовить себе памяти впрок для них,
а не добавлять по одному. Т.е те же самые действия что Вы делали бы вы вручнуюс кучей кода, с вектором (и другими стл-подобными контейнерами) решаются просто путем указания ему нужного поведения. 


--------------------
PM MAIL WWW   Вверх
RaP1D
Дата 28.10.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



mes, спасибо!!  smile 

А как узнать сколько памяти выделяется под вектор? sizeof(enemy) показывает всегда одно и тоже число - быть может он считает только 1 элемент массива?
PM MAIL   Вверх
mes
Дата 29.10.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(RaP1D @  28.10.2008,  23:14 Найти цитируемый пост)
А как узнать сколько памяти выделяется под вектор?

enemy.size ()

http://www.firststeps.ru/mfc/stl/
 smile 

Это сообщение отредактировал(а) mes - 29.10.2008, 00:29


--------------------
PM MAIL WWW   Вверх
RaP1D
Дата 29.10.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



mes,  мм, нет enemy.size() указывает сколько элементов в массиве создано...
PM MAIL   Вверх
baldina
Дата 29.10.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



RaP1D, что-то мне подсказывает, что тебе требуется 
1. динамически добавлять и удалять объекты в контейнер
2. осуществлять к ним последовательный доступ (перебор)

если так, объекты лучше хранить в связном списке. для списков операции добавления/удаления имеют порядок роста O(1)
можно использовать стандартный:
Код

#include <iostream>
#include <list>

class Object
{
public:
    int x;
    int y;
};

int main(int argc, char* argv[])
{
    std::list<Object> enemy;
    const size_t enemy_n = 4;
    for(int i=0; i< enemy_n; ++i)
    {
        Object o;
        o.x = i;
        o.y = i;
        enemy.push_back (o);
    }

    int x;
    std::cin >> x;
    if (x == 1) 
    {
        // добавить в конец
        Object o;
        o.x = enemy.size();
        o.y = enemy.size();
        enemy.push_back (o);
    }

    // удалить первый
    enemy.erase (enemy.begin());

   // вывести значения
   for (std::list<Object>::iterator i=enemy.begin(); i != enemy.end(); ++i)
       std::cout << '(' << i->x << ',' << i->y << ")\n";
}

писал тут, проверь
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.