Re[3]: Динамический критерий сортировки через boost::bind
От: Bell Россия  
Дата: 29.03.06 09:17
Оценка: 2 (1) :)
Здравствуйте, Ulin, Вы писали:


B>>Во-вторых, вот вариант с лямдой:

U>Симпатишно. коротко. А с boost::bind так же коротко никак?

   namespace bb = boost;
   sort(
      arr.begin(), arr.end(), 
      bb::bind(greater<float>(),
         bb::bind(&CVector::y, bb::bind(&CUnitPos::coords, _1)),
         bb::bind(&CVector::y, bb::bind(&CUnitPos::coords, _2))
         )
      );


ЗЫ
Даже и не знаю что сказать насчет короткости и симпатичности...
Любите книгу — источник знаний (с) М.Горький
Re: Динамический критерий сортировки через boost::bind
От: ArtDenis Россия  
Дата: 29.03.06 08:43
Оценка: 1 (1) :)
Ulin пишет:
> А как быть в случае с вложенной структурой? Как корректно достучать до ее полей? Если для этого придется городить еще один nested boost::bind, то пожалуй овчинка выделки не стоит, лучше уже функцию сравнения написать отдельную IMHO...

Твоё IMHO — очень даже правильное IMHO
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Динамический критерий сортировки через boost::bind
От: Bell Россия  
Дата: 29.03.06 08:55
Оценка: 1 (1)
Здравствуйте, Ulin, Вы писали:

Во-первых, для сортировки по убыванию лучше подходит std::greater
Во-вторых, вот вариант с лямдой:

struct CVector {
    float x;
    float    y;
};

struct CUnitPos {
    CVector        coords;
    
    float    some_other_field;
};


int main()
{
   vector<CUnitPos> arr;

   namespace bl = boost::lambda;
   sort(
      arr.begin(), arr.end(), 
      bl::bind(&CVector::y, bl::bind(&CUnitPos::coords, bl::_1)) > 
      bl::bind(&CVector::y, bl::bind(&CUnitPos::coords, bl::_2))
      );

   return 0;
}


Если доработать напильником, то можно будет наверное и на boost::bind перевести...
Любите книгу — источник знаний (с) М.Горький
Динамический критерий сортировки через boost::bind
От: Ulin США  
Дата: 29.03.06 08:34
Оценка:
Имею структуру следующего вида:


struct CVector {
    float x;
    float    y;
};

struct CUnitPos {
    CVector        coords;
    
    float    some_other_field;
};


Имею вектор из CUnitPos. Задача — отсортировать вектор в порядке убывания значение coords.y
Пытаюсь слабать динамический критерий сортировки:

    std::sort(    vec.begin(), vec.end(), 
                boost::bind(std::less<float>(), 
                            boost::bind( &CUnitPos::coords::y, _1 ),
                            boost::bind( &CUnitPos::coords::y, _2 )
                )
    );


Ессно компилится такое отказывается. С критерием сортировки по some_other_field проблем нет, все компилится и работает. А как быть в случае с вложенной структурой? Как корректно достучать до ее полей? Если для этого придется городить еще один nested boost::bind, то пожалуй овчинка выделки не стоит, лучше уже функцию сравнения написать отдельную IMHO...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Динамический критерий сортировки через boost::bind
От: Ulin США  
Дата: 29.03.06 09:03
Оценка:
Здравствуйте, Bell, Вы писали:

B>Во-первых, для сортировки по убыванию лучше подходит std::greater


Ну там наверное возрастание, а не убывание, это я так, для примера, в общем не суть, поменять less на greater 5 сек..

B>Во-вторых, вот вариант с лямдой:


Симпатишно. коротко. А с boost::bind так же коротко никак?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Динамический критерий сортировки через boost::bind
От: Ulin США  
Дата: 29.03.06 10:17
Оценка:
Здравствуйте, Bell, Вы писали:

B>
B>   namespace bb = boost;
B>   sort(
B>      arr.begin(), arr.end(), 
B>      bb::bind(greater<float>(),
B>         bb::bind(&CVector::y, bb::bind(&CUnitPos::coords, _1)),
B>         bb::bind(&CVector::y, bb::bind(&CUnitPos::coords, _2))
B>         )
B>      );
B>


B>ЗЫ

B>Даже и не знаю что сказать насчет короткости и симпатичности...

Ну, не так страшно, как мне показалось изначально
Зато вся логика в месте вызова.
Спасибо
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Динамический критерий сортировки через boost::bind
От: SP_ Украина  
Дата: 29.03.06 11:15
Оценка:
Здравствуйте, Ulin, Вы писали:

U>Симпатишно. коротко. А с boost::bind так же коротко никак?


Начиная с 1.33 в bind добавили перегрузку операторов !, ==, !=, <, <=, >, >=.
По этому по идее должно сработать
   namespace bb = boost;
   sort(
      arr.begin(), arr.end(), 
      bb::bind(bb::bind(&CVector::y, bb::bind(&CUnitPos::coords, _1))<
         bb::bind(&CVector::y, bb::bind(&CUnitPos::coords, _2))
         )
      );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.