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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 115 116 [117] 118 119 ... 140
1741  Программирование / С/C++ / Re: Как сделать кратко/красиво : Март 15, 2011, 23:25
Это должно быть по быстрее Подмигивающий
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 */
/* Дальше все действия с ним..  */
}
 

Хотя я это не проверял)
1748  Разное / Объявления / Re: Симпатичная работа ищет программиста PHP для серьезных отношений : Март 15, 2011, 18:11
web-it, а сказать что за город, не? Или тут все по определению должны быть питерские-московские-бобруйские?
Адрес:   г. Москва, Проспект Мира, дом 101В, строение 2, этаж 3
1749  Программирование / С/C++ / Re: Как сделать кратко/красиво : Март 15, 2011, 17:05
Я бы посмотрел в сторону алгоритма find_if, в сочетании с count_if

Или вот, пожалуй, лучше всего подходит под это дело:
http://www.cplusplus.com/reference/algorithm/unique_copy/
 
1750  Qt / Вопросы новичков / Re: При наведении мыши... : Март 14, 2011, 21:53
Поле из 100 кнопок..
И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное..
Интересно))
Бредовая догадка: не морской бой часом?

Приз в студию! Да, морской бой Улыбающийся По программированию задали

Насчет кнопок - разобрался. Конечно, скорость не ахти, но уже времени нет оптимизировать код)

Элементарно, Ватсон.. Вы уже об этом упоминали ранее.
Кнопки - это не самый лучший вариант.
1751  Qt / Вопросы новичков / Re: При наведении мыши... : Март 14, 2011, 21:06
Поле из 100 кнопок..
И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное..
Интересно))
Бредовая догадка: не морской бой часом?
1752  Qt / Вопросы новичков / Re: Как перевести из QString в Qt::PenStyle : Март 14, 2011, 19:42
Судя по всему, чувак просто хочет сохранять настройки, в частности Qt::PenStyle, через QSettings и доставать их потом при загрузке..
Хотя в соседней теме вроде уже ответели на этот вопрос  Непонимающий

   
1753  Qt / Вопросы новичков / Re: Как перевести из QString в Qt::PenStyle : Март 14, 2011, 19:03
...есть какой-то нетривиальный способ через QMetaEnum добраться до пропертей из неймспейса Qt.
Ну ну...  Смеющийся
Авварон, мне нравится ваше чувство юмора)
1754  Qt / Вопросы новичков / Re: Как перевести из QString в Qt::PenStyle : Март 14, 2011, 17:43
Здравствуйте не подскажите как перевести из QString в Qt::PenStyle

reinterpret_cast попробуй))
Код
C++ (Qt)
Qt::PenStyle penStyle = reinterpret_cast<Qt::PenStyle>(str);
 
1755  Программирование / С/C++ / Re: Возврат ссылки : Март 11, 2011, 18:53
И вообще есть уже стандартный тип исключения при таких ситуациях:
std::out_of_range в
#include <stdexcept>
Страниц: 1 ... 115 116 [117] 118 119 ... 140

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