Russian Qt Forum
Май 14, 2024, 00:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как сделать кратко/красиво  (Прочитано 7868 раз)
_govorilka
Гость
« Ответ #15 : Март 16, 2011, 07:43 »

А так:
Код
C++ (Qt)
 
void createShapes(QVector<CMesh*>& mesh, QVector<CShape*>& shape)
{
    QHash<int, CMesh*> meshCache;
    foreach(CMesh* m, mesh)
   {
         CMesh* m2 = meshChach.value(m->mFriction, 0);
         if(m2)
        {
              m2->Append(m);
        }
        else
        {
              meshCache.insert(m->mFriction, m);
        }
   }
   foreach(CMesh* m, meshCache.values)
  {
        shape.append(m->createShape());
  }
}
 

Это тоже самое, что у тебя но через QHash кода меньше.

Можно оптимизировать. Если добавить указатель на CMesh в класс CShape, то второй QHash будет не нужен.
« Последнее редактирование: Март 16, 2011, 13:21 от _govorilka » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Март 16, 2011, 12:56 »

Я бы добавил в класс CMesh функцию:
Код
C++ (Qt)
 
void apply(CShape* shape);
 

Тогда можно написать, что типа этого:
Так по задаче нельзя - все Append должны быть применены к CMesh ДО вызова CreateShape (т.е. созданная CShape представляет все слитые данные, изменить их в CShape уже нельзя)
« Последнее редактирование: Март 16, 2011, 13:41 от Igors » Записан
_govorilka
Гость
« Ответ #17 : Март 16, 2011, 13:24 »

А так:
Код
C++ (Qt)
 
void createShapes(QVector<CMesh*>& mesh, QVector<CShape*>& shape)
{
    QHash<int, CMesh*> meshCache;
    foreach(CMesh* m, mesh)
    {
         CMesh* m2 = meshChach.value(m->mFriction, 0);
         if(m2)
        {
                 m2->Append(m);
        }
        else
        {
              meshCache.insert(m->mFriction, m);
        }
   }
   foreach(CMesh* m, meshCache.values)
  {
        shape.append(m->createShape());
  }
}
 

Это тоже самое, что у тебя но через QHash кода меньше.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Март 16, 2011, 14:11 »

А так:
А так согласен, намного короче. Там правда mFriction float и после Append надо делать Clear - но не суть. Проходят и др ассоциативные контейнеры, для полноты вариант с std::map

Код
C++ (Qt)
void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtr & shape )
{
typedef std::map <float, CMesh *> TFrictionMap;
TFrictionMap fMap;
TFrictionMap::iterator it;
 
for (size_t i = 0; i < mesh.size(); ++i) {
  CMesh * m = mesh[i];
  it = fMap.find(m->mFriction);
  if (it == fMap.end())
   fMap.insert(std::make_pair(m->mFriction, m));
  else {
    it->second->Append(*m);
    m->Clear();
  }
}
 
for (it = fMap.begin(); it != fMap.end(); ++it)
 shape.push_back(it->second->CreateShape());  
}
 
Правда запрягается контейнер, но это допустимо/нормально.

По ходу дела (конечно это др. задача, но интересно): а если "нечеткое" совпадение ключа? Например нужно сливать CMesh если их mFriction отличается не более чем на заданный epsilon (напр 1.0e-5)

Спасибо
« Последнее редактирование: Март 16, 2011, 14:14 от Igors » Записан
_govorilka
Гость
« Ответ #19 : Март 16, 2011, 14:41 »

По ходу дела (конечно это др. задача, но интересно): а если "нечеткое" совпадение ключа? Например нужно сливать CMesh если их mFriction отличается не более чем на заданный epsilon (напр 1.0e-5)

Насколько я помню у std::map третий параметр в шаблоне - функция, которая она вызывает для сравнения элементов. В STL не силен, точно сказать не могу. В Qt для сравнения двух float есть функция:
Код
C++ (Qt)
bool qFuzzyCompare ( float p1, float p2 )
 
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.18 секунд. Запросов: 20.