[c++]stru


(Damiankominiak) #1

s


([alex]) #2

http://www.cplusplus.com/reference/stl/list/push_back/


(Damiankominiak) #3
listlista;

 lista.push_back(osoba.imie);

czy to już jest utworzenie listy??jak ją wyświetlic??


(Blapiter) #4

Dziwi mnie użycie struktur a nie klas ale do rzeczy :slight_smile: :

#include 

#include 

#include 

#include 


using namespace std;


struct struktura 

{

	string imie;

	string nazwisko;

	string numer;

}; 


int main(int argc, char *argv[])

{    

    list tablica;

	ifstream plik("odczyt.txt", ios::in);

    if(plik.is_open())

	{

		while(!plik.eof())

		{

			  struktura osoba;

			  plik>>osoba.imie>>osoba.nazwisko>>osoba.numer;

			  tablica.push_back(osoba);

		}		

		plik.close();

		if(!tablica.empty())

		{

			for(list::iterator it = tablica.begin(); it != tablica.end(); ++it)

			{

				cout<imie<<" "<nazwisko<<" "<numer<
			}

		}

		else

		{

			cerr<<"Lista jest pusta."<
		}

	}

	else

	{

		cerr<<"Blad otwarcia pliku"<
	}	


	cin.sync();

	cin.get();

    return 0;

}

(Martini M) #5

Witam,

Generalnie tak to już będzie lista. Tylko pytanie listę czego chcesz zrobić? Stringów, czy swoich struktur?

Jeżeli swoich struktur to deklaracja listy będzie inna:

std::lista moja_lista

Teraz sprawa wyświetlania. Możesz zrobić to ręcznie czyli w pętli pobierać element z listy i na strumień wypisywać każde pole z osobna, ale jest to mało eleganckie rozwiązanie. Czemu? Wyobraź sobie, że w wielu miejscach musisz przeglądać taką listę i wypisywać każdy element i co(?), za każdym razem będziesz pieczołowicie wypisywał wszystkie pola? A jeżeli struktura się zmieni (np. dojdzie jakieś pole?) to we wszystkich miejscach będziesz musiał to poprawić - powodzenia :smiley:

Dlatego lepiej jest nauczyć Twoją strukturę przedstawiać się, dorabiając wewnątrz niej metodę zajmującą się wyświetlaniem, np. show(), albo ToString() - polecam ToString(), gdyż jest mile widziane przez wiele funkcji systemowych, które zakładają, że dana klasa, albo struktura posiada taką metodę i starają się ją wywołać.

Powodzenia.


(Damiankominiak) #6

f


(Sawyer47) #7

Do sortowania o dziwo służy funkcja sort: http://www.cppreference.com/wiki/container/list/sort , trzeba jej dać funkcję porównującą.


(Damiankominiak) #8

a jak ta funkcja działa dla stringów i czy jak mam sortować według wybranego pola to mogę użyć instrukcji warunkowej?


(Sawyer47) #9

Masz tam napisane, dla dowolnych typów elementów używany jest operator<, albo przekazana funkcja porównująca, która powinna działać jak operator<. Jeśli piszesz swoją funkcję to teoretycznie możesz w niej robić co chcesz, byleby mogła przyjąć dwa argumenty, które są porównywane i zwróciła coś co ma wartość logiczną.


(Damiankominiak) #10

dlaczego coś takiego nie działa?


(Sawyer47) #11

Bo zapewne zmienna osoba jest jakiegoś typu napisanego przez Ciebie, który nie ma zdefiniowanego operatora <. Skąd list::sort ma wiedzieć jak porównać dwa elementy?


(Damiankominiak) #12

jakbyś mógł napisać fragment programu, bo nie kumam


(Sawyer47) #13

Nie ma potrzeby samemu pisać funkcji sortującej - wystarczy napisać funkcję pełniącą rolę operatora < i podać ją do wbudowanych funkcji sort. Coś w stylu

bool Typ_lt(const Typ& a, const Typ& b)

{

    // tutaj porównujesz co chcesz, wedle czego chcesz

    // taki pseudokod: 

    return coś(a) < coś(b);

}

Oczywiście można też zdefiniować operator < dla swojego typu.


(Damiankominiak) #14

niestety nie poradze sobie z tym, jakbyś mógł napisać mi to. Ja musze posortować liste według wybranego pola czyli :imie,nazwisko i numer.Dopiero co poznałem listy i dlatego nie mam pojęcia.


(Sawyer47) #15

Powtarzając nieco powyższy kod, dla sortowania wg pola imie mogłoby to wyglądać tak

bool typ_lt(const Typ& a, const Typ& b)

{

    return a.imie < b.imie;

}

Zakładając oczywiście, że typ pola imie ma zdefiniowany operator<. Równie dobrze powyższa funkcja mogła by być zadeklarowana jako operator< dla typu, który napisałeś, ale tu znów się powtarzam.


(Damiankominiak) #16

dobra wole napisać swoją funkcje sortującą, tylko powiedz co jest źle

tonkcja zamienia litery, niestety


(Blapiter) #17

Najlepiej jest przeciążyć operator w klasie czy strukturze tutaj na przykład monza sortować po nazwisku:

struct struktura 

{

       string imie;

       string nazwisko;

       string numer;

       friend bool operator<(const struktura & osoba1, const struktura & osoba2)

       {

			return osoba1.nazwisko < osoba2.nazwisko;			

       }

};

i teraz można użyć standardowo już kodu

lista.sort();

(Damiankominiak) #18

tyl


(Gutek) #19

damcios po co edytowałeś pierwszy post?

Używając przycisku zmien.gif

Pozdrawiam Gutek