1742
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Март 15, 2011, 23:17
|
Не въехал с сынтаксысом. Вроде "начальное значение" для accumulate обязательно,
Да, попутал)) Вот окончательно: C++ (Qt) class MyFunctor { public: CMesh * operator()(CMesh *a, CMesh *b) { if ((a->mFriction == b->mFriction) && (a->mFriction == m_unique_friction.back()) && m_tag) { a->Append(b); b->Clear(); } return a; } bool frictionIsContains(float f) { vector<float>::iterator it = find(m_unique_friction.begin(), m_unique_friction.end(), f); if (it == m_unique_friction.end()) { m_unique_friction.push_back(f); m_tag = true; return !m_tag; } m_tag = false; return !m_tag; } private: vector<float> m_unique_friction; bool m_tag; }; void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape ) { TMeshPtrVec::iterator it = mesh.begin(); MyFunctor func; for (; it != mesh.end(); ++it) { if (func.frictionIsContains((*it)->mFriction)) continue; CMesh *cm = accumulate(it, mesh.end(), *it, func); shape.push_back(cm->CreateShape()); } }
|
|
|
1743
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Март 15, 2011, 22:35
|
Тогда как вариант: C++ (Qt) class MyFunctor { public: CMesh * operator()(CMesh *a, CMesh *b) { if ((a->mFriction == b->mFriction) && (a->mFriction == m_unique_friction.back()) && m_tag) { a->Append(b); b->Clear(); return a; } return 0; } bool frictionIsContains(float f) { vector<double>::iterator it = find(m_unique_friction.begin(), m_unique_friction.end(), f); if (it != m_unique_friction.end()) { m_unique_friction.push_back(f); m_tag = true; return m_tag; } m_tag = false; return m_tag; } private: vector<float> m_unique_friction; bool m_tag; }; void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape ) { TMeshPtrVec::iterator it = mesh.begin(); MyFunctor func; for (; it != mesh.end(); ++it) { if (!func.frictionIsContains((*it)->mFriction)) continue; CMesh *cm = accumulate(it, mesh.end(), func); shape.push_back(cm->CreateShape()); } }
|
|
|
1744
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Март 15, 2011, 21:44
|
Можно непосредственно в функции myBinaryPredicate "сливать" данные из одного (a) в другой (b) (с помощью Append), если они равны.
Может даже это и будет работать (не знаю), но делать такие "масштабные" действия в ф-ции предназначенной просто для сравнения - никак не гуд. Почему эт? Это всё равно придётся делать) Кстати, зачем тогда придумали ещё и объекты функций? Правильно, для большей гибкости. Да и копирование вектора (с последующим resize) хорошего впечатления не производит. Нельзя сделать как-то "через голову", не слишком привлекая мутность STL?
Да он всё равно локален и разрушится при выходе из функции. Сколько там (в mesh) в среднем элементов планируется держать? Если без этого временного вектора v, то тогда лучше использовать find_if, но это будет медленее и так кратко не думаю что получится.
|
|
|
1745
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Март 15, 2011, 21:05
|
В смысле долит? Этот код создаёт только вектор с указателями на уникальные mFriction.. Он ничё никуда не доливает)
Ну а зачем такой вектор нужен? Ведь задача объединить (с помощью Append) подходящие элементы и создать для них одну CShape. Можно непосредственно в функции myBinaryPredicate "сливать" данные из одного (a) в другой (b) (с помощью Append), если они равны. Кстати о птичках: если уж создавать вектор уникальных, то не лучше ли сначала отсортировать, а затем один раз вызвать unique_copy (а то увлеклись списыванием Улыбающийся)
Можно, конечно) Я просто Вашу бдительность проверял))
|
|
|
1746
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Март 15, 2011, 20:47
|
Хотя я это не проверял)
Та вижу что нет Пусть первые 2 элемента имеют одинаковый ключ (mFriction). Тогда, если я правильно понимаю, unique_copy поместит в выходной вектор лишь первый из них, второй не будет долит к первому - а должен В смысле долит? Этот код создаёт только вектор с указателями на уникальные mFriction.. Он ничё никуда не доливает) Если я правильно понимаю, то доливание одного вектора в другой, если у них одинаковые mFriction можно произвести в myBinaryPredicate...
|
|
|
1747
|
Программирование / С/C++ / Re: Как сделать кратко/красиво
|
: Март 15, 2011, 20:17
|
Ну вот, например: C++ (Qt) bool myBinaryPredicate(CMesh* a, CMesh* b) { return (a->mFriction == b->mFriction); } bool compare (CMesh* a, CMesh* b) { return (a->mFriction < b->mFriction); } void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape ) { TMeshPtrVec v = mesh; TMeshPtrVec::iterator it = unique_copy (mesh.begin(), mesh.end(), v.begin(), myBinaryPredicate); sort (v.begin(), it, compare); it=unique_copy (v.begin(), it, v.begin(), myBinaryPredicate); v.resize( it - v.begin()); /* v - теперь содержит указатели на CMesh c уникальными значениями mFriction */ /* Дальше все действия с ним.. */ }
Хотя я это не проверял)
|
|
|
1750
|
Qt / Вопросы новичков / Re: При наведении мыши...
|
: Март 14, 2011, 21:53
|
Поле из 100 кнопок.. И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное.. Интересно)) Бредовая догадка: не морской бой часом?
Приз в студию! Да, морской бой По программированию задали Насчет кнопок - разобрался. Конечно, скорость не ахти, но уже времени нет оптимизировать код) Элементарно, Ватсон.. Вы уже об этом упоминали ранее. Кнопки - это не самый лучший вариант.
|
|
|
1751
|
Qt / Вопросы новичков / Re: При наведении мыши...
|
: Март 14, 2011, 21:06
|
Поле из 100 кнопок.. И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное.. Интересно)) Бредовая догадка: не морской бой часом?
|
|
|
|
|