Sortowanie przez wstawianie w kontenerze listy dwukierunkowej

Odpowiedz Nowy wątek
2015-01-02 20:03
sebastian1234
0

Witam,
Mam problem z sortowaniem przez wstawianie w kontenerze listy dwukierunkowej.
Zczytuje z pliku tekstowego osoby, są ich 3 typy.
Stworzyłem klase wirtualną Osoba, oraz 3 klasy pochodne (rózne typy osób).
Chciałbym posortować te osoby, np. ze względu na nazwiska. Utworzyłem kontener, oraz iterator:

list<Osoba *> zbior; 
list<Osoba *>::iterator it;

Teraz mam problem, w jaki sposób porównywać te obiekty(jak dobrać się do tego stringa z nazwą danej osoby)

Tak wyglądają moje klasy

class Osoba
{
protected:
    string nazwa;
    short rok;
public:
    virtual void dopisz(string linia)=0;
 
};
 
class Programista: public Osoba
{
    short staz;
    vector<string> technologie;
public:
    Programista(string linia);
    void dopisz(string linia);
};
 
class Kierownik: public Osoba
{
    short doswiadczenie;
    vector<string> szkolenia;
public:
    Kierownik(string linia);
    void dopisz(string linia);
};
 
class Handlowiec: public Osoba
{
    short sprzedane_programy;
    vector<string> jezyki;
public:
    Handlowiec(string linia);
    void dopisz(string linia);
};

Z góry dzięki za podpowiedzi ;)

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2015-01-02 22:12
0

http://www.cplusplus.com/reference/list/list/sort/

bool Osoba::cmp_nazwa(const Osoba &os)const { return nazwa<os.nazwa; }
bool cmp(const Osoba *a,const Osoba *b) { return a->cmp_nazwa(*b); }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-04 22:13
sebastian1234
0

Dzięki wielkie :)

A żeby dobrać się do nazwy danej osoby wystarczyło użyć

(**it).nazwa 

Pozostało 580 znaków

2015-01-06 17:40
sebastian1234
0

Jeszcze jedno pytanie

Przy próbie zapisu posortowanych osób, wyskakuje mi błąd

d:\programy\c++ ide\vc\include\fstream(1347): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          d:\programy\c++ ide\vc\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_fstream<_Elem,_Traits>::basic_fstream(const std::basic_fstream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]

a tak wygląda kod uzywany do zapisu osób w pliku:

fstream plik1;
        plik1.open("sortowanie.txt",ios::out);
        if(plik1.good())
        {
            for(it=zbior.begin();it!=zbior.end();it++) 
            cout<<(**it).nazwa<<endl;
            (**it).wypisz(plik1);
        }
 
void Programista::wypisz(fstream plik)
{
    plik<<"P: "<<nazwa<<", "<<staz;
    vector<string>::iterator it;
    for(it=technologie.begin();it!=technologie.end();it++)
        plik<<", "<<(*it);
}
 
void Kierownik::wypisz(fstream plik)
{
    plik<<"K: "<<nazwa<<", "<<doswiadczenie;
    vector<string>::iterator it;
    for(it=szkolenia.begin();it!=szkolenia.end();it++)
        plik<<", "<<(*it);
}
 
void Handlowiec::wypisz(fstream plik)
{
    plik<<"H: "<<nazwa<<", "<<sprzedane_programy;
    vector<string>::iterator it;
    for(it=jezyki.begin();it!=jezyki.end();it++)
        plik<<", "<<(*it);
}
 

Z góry dzięki za wszelkie uwagi

Pozostało 580 znaków

2015-01-06 17:54
0

WTF! Po kiego tworzysz kopię iteratorów?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-06 19:18
sebastian1234
0

Metody klas są zawarte w innym pliku, niż main, dlatego w każdej robie osobno iterator. O to Ci chodziło?

Pozostało 580 znaków

2015-01-06 19:20
0

Nie, chodzi mi o to że odpalasz konstruktor kopiujący dla iteratora przed każdym jego zwiększeniem, robisz bezsensowną operacje na każdym kroku pętli.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-06 19:29
sebastian1234
0
fstream plik1;
        plik1.open("sortowanie.txt",ios::out);
        if(plik1.good())
        {
            for(it=zbior.begin();it!=zbior.end();it++) 
            cout<<(**it).nazwa<<endl;
            (**it).wypisz(plik1);
        }
 
vector<string>::iterator it;
 
void Programista::wypisz(fstream plik)
{
    plik<<"P: "<<nazwa<<", "<<staz;
    for(it=technologie.begin();it!=technologie.end();it++)
        plik<<", "<<(*it);
}
 
void Kierownik::wypisz(fstream plik)
{
    plik<<"K: "<<nazwa<<", "<<doswiadczenie;
    for(it=szkolenia.begin();it!=szkolenia.end();it++)
        plik<<", "<<(*it);
}
 
void Handlowiec::wypisz(fstream plik)
{
    plik<<"H: "<<nazwa<<", "<<sprzedane_programy;
    for(it=jezyki.begin();it!=jezyki.end();it++)
        plik<<", "<<(*it);
}

Teraz ok?

przez argument przekazuje teraz (fstream & plik) co rozwiązało sprawe błędu o którym wspominałem(strumień trzeba przesłać przez referencje, nie można go skopiować). Pojawił się teraz problem: Expression: list iterator not dereferencable. Dopiero zaczynam się uczyć korzystać z kontenerów STL i nie wiem jak to rozwiązać - sebastian1234 2015-01-06 19:44
@sebastian1234 na temat udzielaj odpowiedzi w postach; Komentarze są do dyskusji nie na temat; - furious programming 2015-01-06 22:10

Pozostało 580 znaków

2015-01-06 21:23
0

Zobacz jak jest zrealizowano ++ita jak it++ http://www.cplusplus.com/reference/iterator/iterator/


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Ok, już wiem, dzięki za źródło. Operator postinkrementacji i preinkrementacji są przeciążone w inny sposób, jeżeli nie chcemy zwracać żadnych wartości, to dużo wydajniejsze jest używanie preinkrementacji, która nie uruchamia konstruktora kopiującego - sebastian1234 2015-01-06 21:43
... która NIE uruchamia ... - _13th_Dragon 2015-01-06 21:46
już poprawione, oczywiście preinkrementacja nie uruchamia :) - sebastian1234 2015-01-06 21:51

Pozostało 580 znaków

2015-01-26 20:24
sebastian12345
0

Jeszcze jedno pytanie
Próbuje zczytać parametry wywołania z linii poleceń i mam problem

int main(int argc, char *argv[])
{    
    fstream plik;
    char *sortowanie, *wejsciowy, * wyjsciowy;
    for(int i=1;i<argc;i++)
    {
        cout<<argc<<endl<<argv[i]<<endl;
        system("PAUSE");
        if(argv[i]=="-i")
        {
            cout<<"Udało wejsc się w ciało instrukcji warunkowej -i";
            i++;
            wejsciowy=argv[i];
        }
        else if(argv[i]=="-s")
        {
            i++;
            sortowanie=argv[i];
        }
        else if(argv[i]=="-o")
        {
            i++;
            wyjsciowy=argv[i];
        }
    }

To jest początek funkcji main, dla parametrów ustawionych w debuggerze : -i wejscie.txt -s nazwa -o wynik.txt

dostaje taki wynik

b3d336f06e.png

Ktoś mógłby pomóc rozwiązać ten problem? Nie moge zapisać wartości parametrów.

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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