struct A
{
int val;
};
bool comp(A* a1, A* a2) {
return (a1->val < a2->val);
}
list<A*> collection;
collection.sort(comp);
Сортировка списка STL
У меня задача отсортировать список STL, который хранит некоторый класс.
Проблема в том что я предаю в список указатели (нужно для экономии памяти) на классы и он мне сортирует элементы по адресам, а надо по содержимому класса (например по int'овому числу).
При сортировке использую метод sort. но ему нужно передать какой -то функциональный объект.
Напишите, пожалуйста, небольшой примерчик.
Заранее благодарен всем не отказавшим в помощи.:)
а самом деле я знаю этот прием, но почему -то он у меня не работает
вот тот же пример, но только с классом
Код:
#include <list>
#include <iostream>
#include <conio.h>
using namespace std;
class numb
{
int num;
public:
numb(int val=0):num(val){};
inline void print() { cout<<num<<"\n"; }
friend bool f(numb *a, numb *b);
};
bool f(numb *a, numb *b)
{
return a->num<b->num;
}
void printList(list<numb*> lst)
{
list<numb*>::iterator iter;
for(iter=lst.begin(); iter!=lst.end(); ++iter)
(*iter)->print();
}
void main()
{
list<numb*> lst;
lst.push_back(new numb(2));
lst.push_back(new numb(4));
lst.push_back(new numb(1));
printList(lst);
cout<<endl;
lst.sort(f);
printList(lst);
getch();
}
#include <iostream>
#include <conio.h>
using namespace std;
class numb
{
int num;
public:
numb(int val=0):num(val){};
inline void print() { cout<<num<<"\n"; }
friend bool f(numb *a, numb *b);
};
bool f(numb *a, numb *b)
{
return a->num<b->num;
}
void printList(list<numb*> lst)
{
list<numb*>::iterator iter;
for(iter=lst.begin(); iter!=lst.end(); ++iter)
(*iter)->print();
}
void main()
{
list<numb*> lst;
lst.push_back(new numb(2));
lst.push_back(new numb(4));
lst.push_back(new numb(1));
printList(lst);
cout<<endl;
lst.sort(f);
printList(lst);
getch();
}
У меня 6 студия выводит сообщение об ошибке:
...\main.cpp(42) : error C2664: 'void __thiscall std::list<class numb *,class std::allocator<class numb *> >::sort(struct std::greater<class numb *>)' : cannot convert parameter 1 fro
m 'bool (class numb *,class numb *)' to 'struct std::greater<class numb *>'
No constructor could take the source type, or constructor overload resolution was ambiguous
Может я чего-то не так пишу. Попробуйте, пожалуйста этот код и скажите что не так.
[color=red]Пользуйся тегом форматирования кода![/color]
Я бы посоветовал переходить на более новый компилятор.
Как можно попробовать решить проблему, используя всё тот же VC6.
1. Можно поставить более корректную версию STL - STLPort (stlport.com).
2. Можно попробовать обойти проблему в твоей текущей версии STL, например, так:
Код:
#include <list>
#include <iostream>
using namespace std;
class numb
{
public:
numb(int val=0) :num(val) {};
inline void print() { cout << num << endl; }
int getNum() const {
return num;
}
private:
int num;
};
template<>
struct greater<numb*>
{
bool operator()(const numb* _Left, const numb* _Right) const {
return (_Left->getNum() > _Right->getNum());
}
};
lst.sort( greater<numb*>() );
#include <iostream>
using namespace std;
class numb
{
public:
numb(int val=0) :num(val) {};
inline void print() { cout << num << endl; }
int getNum() const {
return num;
}
private:
int num;
};
template<>
struct greater<numb*>
{
bool operator()(const numb* _Left, const numb* _Right) const {
return (_Left->getNum() > _Right->getNum());
}
};
lst.sort( greater<numb*>() );
И ещё совет: не используй friend, это плохой стиль.
Спасибо большое...:cool: