s
listlista;
lista.push_back(osoba.imie);
czy to już jest utworzenie listy??jak ją wyświetlic??
Dziwi mnie użycie struktur a nie klas ale do rzeczy :
#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;
}
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
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.
f
Do sortowania o dziwo służy funkcja sort: http://www.cppreference.com/wiki/container/list/sort , trzeba jej dać funkcję porównującą.
a jak ta funkcja działa dla stringów i czy jak mam sortować według wybranego pola to mogę użyć instrukcji warunkowej?
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ą.
dlaczego coś takiego nie działa?
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?
jakbyś mógł napisać fragment programu, bo nie kumam
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.
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.
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.
dobra wole napisać swoją funkcje sortującą, tylko powiedz co jest źle
tonkcja zamienia litery, niestety
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();
tyl
damcios po co edytowałeś pierwszy post?
Używając przycisku
Pozdrawiam Gutek