Сортировка спика объектов (list STL VC++ 6)
От: vovaiv12  
Дата: 14.11.04 22:47
Оценка:
Есть следующие классы:

class CMyObj
{
public:
CMyObj(void);
CMyObj(int id){}
~CMyObj(void);
int getTime(){return time;}
int getID(){return ID;}
private:
int ID;
int time;
};
//---------------------------------------------------------------------
class CMyCore
{
public:
CMyCore();
~CMyCore();
bool addObject(CMyObj* obj){ objects.push_back(obj);return 1;}
bool removeObject(int id){};
bool queryObjects();
#ifdef DEBUG
void printState();
#endif
private:
list<CMyObj*> objects;
list<CMyObj*>::iterator objIter;
};

Необходимо отсортировать список объектов objects по времени(time)

Использую следующий код:

bool operator <(CMyObj& a,CMyObj& b)
{
if (a.getTime()>b.getTime()) return true;
return false;
}
//…
objects.sort(operator <);
//…

Получаю ошибку компилятора в <list> d:\Microsoft Visual Studio .NET\Vc7\include\list(735): error C2664: 'bool (CMyObj &,CMyObj & ' : cannot convert parameter 2 from 'CMyObj *' to 'CMyObj &'
d:\Microsoft Visual Studio .NET\Vc7\include\list(735): error C2664: 'bool (CMyObj &,CMyObj & ' : cannot convert parameter 1 from 'CMyObj *' to 'CMyObj &'

Если objects объявить как

list<CMyObj> objects;
list<CMyObj>::iterator objIter;

Все работает и прекрасно сортирует. Но очевидно ,что хранить сами объекты это не дело,
если мне нужно их только опрашивать .


При попытке объявить

bool operator <(CMyObj* a,CMyObj* b)
{
if (a.getTime()>b.getTime()) return true;
return false;
}

e:\MyCore.cpp(8): error C2803: 'operator <' must have at least one formal parameter of class type


Что подскажете?
Re: Сортировка спика объектов (list STL VC++ 6)
От: zorgg http://elens.ru
Дата: 14.11.04 23:20
Оценка:
Здравствуйте, vovaiv12, Вы писали:

V>Есть следующие классы:


V>Необходимо отсортировать список объектов objects по времени(time)


V>Что подскажете?


Не уверен в качестве такого решения, но я делал так:

    template<class _Ty, class _f>
    struct myGreater : std::greater<_Ty> {
    bool operator()(const _Ty& _X, const _Ty& _Y) const
            {return (_X->_f() > _Y->_f()); }
    };

    ...


    void myClass::Sort()
    {
        myGreater<CMyObj*, time> my_greater;
        objects.sort( my_greater )
    }
Re[2]: Сортировка спика объектов (list STL VC++ 6)
От: zorgg http://elens.ru
Дата: 14.11.04 23:22
Оценка:
ошибочка, вместо
  {return (_X->_f() > _Y->_f()); }

должно быть
  {return (_X->_f > _Y->_f); }
Re: Сортировка спика объектов (list STL VC++ 6)
От: Bell Россия  
Дата: 15.11.04 10:50
Оценка:
Здравствуйте, vovaiv12, Вы писали:

V>Необходимо отсортировать список объектов objects по времени(time)


Первое: насколько видно из постановки, речь идет о списке указателей на объекты. Решается эта задача с помощью встроенного алгоритма
template <class Pred>
std::list<T>::sort(Pred pr)

для использования которого нужен предикат. В твоем случае этот предикат можно сделать так:

struct my_pred
{
   bool operator() const (const CMyObj* lp, const CMyObj* rp) { return lp->getTime() > rp->getTime(); }
};


Использование:
objects.sort(my_pred());



Второе: речь все-таки идет о VC7. Если же эта функциональность нужна для VC 6, то с его "родной" STL решить эту проблему нельзя из-за кривой реализации встроенного алгоритма sort с предикатом (это решается путем прикручивания STLPort)
Любите книгу — источник знаний (с) М.Горький
Re[2]: Сортировка спика объектов (list STL VC++ 6)
От: Кодт Россия  
Дата: 15.11.04 11:05
Оценка:
Здравствуйте, Bell, Вы писали:

B>Второе: речь все-таки идет о VC7. Если же эта функциональность нужна для VC 6, то с его "родной" STL решить эту проблему нельзя из-за кривой реализации встроенного алгоритма sort с предикатом (это решается путем прикручивания STLPort)


Или исправлением багов Dinkumware STL (http://www.dinkumware.com/vc_fixes.html) ?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.