Sortowanie przez wstawianie w kontenerze listy dwukierunkowej

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 ;)

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); }
0

Dzięki wielkie :)

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

(**it).nazwa 
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

0

WTF! Po kiego tworzysz kopię iteratorów?

0

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

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.

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?

0

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

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.

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