problem z sortowaniem listy

0

Ponizej czesc kodu. W klasie Tabela jest lista typu zadanie i musze ja posortowac wzgledem okreslonego pola, wiec dodalem biblioteke algorithm gdzie znajduje sie funkcja sort() i probuje ja wywolac:

 kolejnosc_topologiczna.sort(sortujP_time);

error: no matching function for call to 'std::list<zadanie, std::allocator<zadanie> >::sort(<unresolved overloaded="overloaded" function="function" type="type">)'|

Jak zrobic to poprawnie??

 #define KOLUMNY 2

#include<iostream>
#include<cstdlib>
#include<fstream>
#include<list>
#include <string>
#include<algorithm>


using namespace std;






//**********************************************KLASA ZADANIE
class zadanie
{   public:
    int nr_zad;
    int lp;
    int maszyna;
    int p_time;
    int poprzed_techn;
    int nast_techn;
    int nast_kolej;
    int poprzed_kolej;
    int liczba_poprzednikow;
    int R;
    int Q;
    bool sprawdzony;
    zadanie();
};

zadanie::zadanie()
{
    nr_zad=0;
    lp=0;
    maszyna=0;
    p_time=0;
    poprzed_techn=0;
    nast_techn=0;
    nast_kolej=0;
    poprzed_kolej=0;
    liczba_poprzednikow=0;
    R=0;
    Q=0;
    sprawdzony=0;
}
//**********************************************************



//**********************************************KLASA TABELA
class Tabela
{

    public:
    int** tablica; //pierwsza kolumna to maszyna druga to p time
    zadanie* zadania; //tablica zadan (tyle ile lp)
    int ile_maszyn;
    int ile_zadan;
    int ile_wierszy;
    string nazwa;
    fstream plik;
    list<zadanie> kolejnosc_topologiczna; // do przechowywania kolejnioscu topolog.
    void WczytajDane();
    void WypiszTabele();
    void LiczTopolog();
    void LiczRQ(); //wyznacza kolejnosc topologiczna
    bool sortujP_time(const zadanie& z1, const zadanie& z2);
    Tabela();
};

bool Tabela::sortujP_time(const zadanie& z1, const zadanie& z2){
	return z1.p_time>z2.p_time;
}

void Tabela::WypiszTabele()
{

    for (int i=0;i<ile_wierszy;i++)
    {
        cout<<endl;
        if (zadania[i].lp>9)
            cout<<zadania[i].lp<<" ";
        else
            cout<<zadania[i].lp<<"  ";

        for (int j=0;j<KOLUMNY;j++)
            {
                if (tablica[i][j]>9)
                cout<<tablica[i][j]<<" ";
                else
                cout<<tablica[i][j]<<"  ";
            }

     if (zadania[i].nast_techn>9)
            cout<<zadania[i].nast_techn<<" ";
     else
            cout<<zadania[i].nast_techn<<"  ";

     if (zadania[i].poprzed_techn>9)
            cout<<zadania[i].poprzed_techn<<" ";
     else
            cout<<zadania[i].poprzed_techn<<"  ";

     if (zadania[i].nast_kolej>9)
            cout<<zadania[i].nast_kolej<<" ";
     else
            cout<<zadania[i].nast_kolej<<"  ";

     if (zadania[i].poprzed_kolej>9)
            cout<<zadania[i].poprzed_kolej<<" ";
     else
            cout<<zadania[i].poprzed_kolej<<"  ";

     if (zadania[i].liczba_poprzednikow>9)
            cout<<zadania[i].liczba_poprzednikow<<" ";
     else
            cout<<zadania[i].liczba_poprzednikow<<"  ";

     if (zadania[i].R>9)
            cout<<zadania[i].R<<" ";
     else
            cout<<zadania[i].R<<"  ";

     if (zadania[i].R>9)
            cout<<zadania[i].Q<<" ";
     else
            cout<<zadania[i].Q<<"  ";
//cout<<endl;
//cout<<endl;
//cout<<endl;
//cout<<endl;
     //  for (int i=0;i<ile_wierszy;i++)
     //  cout<<zadania[i].nast_kolej<<endl;
    }
    cout<<endl;
    cout<<endl;
    for( list<zadanie>::iterator iter=kolejnosc_topologiczna.begin(); iter != kolejnosc_topologiczna.end(); ++iter )
    cout<<iter->lp<<" ";
    kolejnosc_topologiczna.sort(sortujP_time);
    cout<<endl;
    cout<<endl;
    for( list<zadanie>::iterator iter=kolejnosc_topologiczna.begin(); iter != kolejnosc_topologiczna.end(); ++iter )
    cout<<iter->lp<<" ";

}
0

Nie chce mi się patrzeć dokładnie na kod, ale się musisz zdecydować czy wywołujesz metodę z <list> czy z <algorithm>. Teraz wywołujesz z kontenera list i tak na oko to ta metoda powinna być statyczna w klasie, albo zupełnie poza nią.

0

Poza tym:

lista napisał(a):
     if (zadania[i].nast_techn>9)
            cout<<zadania[i].nast_techn<<" ";
     else
            cout<<zadania[i].nast_techn<<"  ";
 

lepiej będzie tak:

/* do include dodaj <iomanip> */
cout << setw(3) << left << zadania[i].nast_techn;

setw - dopełnij element spacjami do zadanej ilości znaków
left - justowanie lewostronne (domyślnie jest prawostronne)

0

hmm moze ktos pomoc jak zrobic to sortowanie ?? probowalem zrobic osobno funkcje poza klasami (nie jako metoda), ale wowczas tez nie dzialalo

0
 #define KOLUMNY 2

#include<iostream>
#include<cstdlib>
#include<fstream>
#include<list>
#include <string>
#include<algorithm>


using namespace std;






//**********************************************KLASA ZADANIE
class zadanie
{   public:
    int nr_zad;
    int lp;
    int maszyna;
    int p_time;
    int poprzed_techn;
    int nast_techn;
    int nast_kolej;
    int poprzed_kolej;
    int liczba_poprzednikow;
    int R;
    int Q;
    bool sprawdzony;
    zadanie();
};

zadanie::zadanie()
{
    nr_zad=0;
    lp=0;
    maszyna=0;
    p_time=0;
    poprzed_techn=0;
    nast_techn=0;
    nast_kolej=0;
    poprzed_kolej=0;
    liczba_poprzednikow=0;
    R=0;
    Q=0;
    sprawdzony=0;
}
//**********************************************************



//**********************************************KLASA TABELA
class Tabela
{

    public:
    int** tablica; //pierwsza kolumna to maszyna druga to p time
    zadanie* zadania; //tablica zadan (tyle ile lp)
    int ile_maszyn;
    int ile_zadan;
    int ile_wierszy;
    string nazwa;
    fstream plik;
    list<zadanie> kolejnosc_topologiczna; // do przechowywania kolejnioscu topolog.
    void WczytajDane();
    void WypiszTabele();
    void LiczTopolog();
    void LiczRQ(); //wyznacza kolejnosc topologiczna
//    bool sortujP_time(const zadanie& z1, const zadanie& z2);
    Tabela();
};

bool sortujP_time(const zadanie& z1, const zadanie& z2){
        return z1.p_time>z2.p_time;
}

void Tabela::WypiszTabele()
{

    for (int i=0;i<ile_wierszy;i++)
    {
        cout<<endl;
        if (zadania[i].lp>9)
            cout<<zadania[i].lp<<" ";
        else
            cout<<zadania[i].lp<<"  ";

        for (int j=0;j<KOLUMNY;j++)
            {
                if (tablica[i][j]>9)
                cout<<tablica[i][j]<<" ";
                else
                cout<<tablica[i][j]<<"  ";
            }

     if (zadania[i].nast_techn>9)
            cout<<zadania[i].nast_techn<<" ";
     else
            cout<<zadania[i].nast_techn<<"  ";

     if (zadania[i].poprzed_techn>9)
            cout<<zadania[i].poprzed_techn<<" ";
     else
            cout<<zadania[i].poprzed_techn<<"  ";

     if (zadania[i].nast_kolej>9)
            cout<<zadania[i].nast_kolej<<" ";
     else
            cout<<zadania[i].nast_kolej<<"  ";

     if (zadania[i].poprzed_kolej>9)
            cout<<zadania[i].poprzed_kolej<<" ";
     else
            cout<<zadania[i].poprzed_kolej<<"  ";

     if (zadania[i].liczba_poprzednikow>9)
            cout<<zadania[i].liczba_poprzednikow<<" ";
     else
            cout<<zadania[i].liczba_poprzednikow<<"  ";

     if (zadania[i].R>9)
            cout<<zadania[i].R<<" ";
     else
            cout<<zadania[i].R<<"  ";

     if (zadania[i].R>9)
            cout<<zadania[i].Q<<" ";
     else
            cout<<zadania[i].Q<<"  ";
//cout<<endl;
//cout<<endl;
//cout<<endl;
//cout<<endl;
     //  for (int i=0;i<ile_wierszy;i++)
     //  cout<<zadania[i].nast_kolej<<endl;
    }
    cout<<endl;
    cout<<endl;
    for( list<zadanie>::iterator iter=kolejnosc_topologiczna.begin(); iter != kolejnosc_topologiczna.end(); ++iter )
    cout<<iter->lp<<" ";
    kolejnosc_topologiczna.sort(sortujP_time);
    cout<<endl;
    cout<<endl;
    for( list<zadanie>::iterator iter=kolejnosc_topologiczna.begin(); iter != kolejnosc_topologiczna.end(); ++iter )
    cout<<iter->lp<<" ";

}

Istnieja kilka możliwości rozwiązania tego problemu, tutaj najbardziej na leniwo ( A ).
A ) Zadeklaruj funkcje sortujP_time jako funkcję globalną ( wcześniej była to metoda klasy ).
B ) Zadeklaruj funkcje sortujP_time jako statyczną metodę klasy.
C ) ( najlepsze rozwiązanie ze względu na OOP ) Zaimplementuj operator< w klasie zadanie. Wtedy funkcję std::sort() wywołujesz bezargumentowo.
D ) Stwórz funktor z Tabela::sortujP_time za pomocą std::mem_fun oraz później std::bind1st

1 użytkowników online, w tym zalogowanych: 0, gości: 1