Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка списка STL

2.2K
26 мая 2007 года
0cool
54 / / 15.06.2006
Здравствуйте.

У меня задача отсортировать список STL, который хранит некоторый класс.
Проблема в том что я предаю в список указатели (нужно для экономии памяти) на классы и он мне сортирует элементы по адресам, а надо по содержимому класса (например по int'овому числу).
При сортировке использую метод sort. но ему нужно передать какой -то функциональный объект.

Напишите, пожалуйста, небольшой примерчик.
Заранее благодарен всем не отказавшим в помощи.:)
3
26 мая 2007 года
Green
4.8K / / 20.01.2000
Код:
struct A
{
    int val;
};

bool comp(A* a1, A* a2) {
    return (a1->val < a2->val);
}

list<A*> collection;

collection.sort(comp);
2.2K
26 мая 2007 года
0cool
54 / / 15.06.2006
Что - то не работает ваш код...
а самом деле я знаю этот прием, но почему -то он у меня не работает
вот тот же пример, но только с классом
Код:
#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();
}


У меня 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]
3
26 мая 2007 года
Green
4.8K / / 20.01.2000
Это проблема VC6. Старый компилятор, старая STL.
Я бы посоветовал переходить на более новый компилятор.

Как можно попробовать решить проблему, используя всё тот же 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*>() );

И ещё совет: не используй friend, это плохой стиль.
2.2K
26 мая 2007 года
0cool
54 / / 15.06.2006
Спасибо большое...:cool:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог