• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista - szablon stl

Object Storage Arubacloud
0 głosów
471 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)
edycja 27 marca 2017 przez krzakurts

Witam :) Muszę napisać listę przy użyciu szablonu. Zadanie byłoby proste, gdybym musiał dodawać do listy pojedyncze elementy ( w sensie jeden element = jedna dana). Jednak u mnie jeden element = nr indeksu, imie, nazwisko itd. Da się użyć w taki sposób funkcji np. push_back()?  

W przypadku kiedy sam implementowałem listę stworzyłem po prostu dwie struktury, jedna odpowiadała za samą listę, natomiast druga była po prostu zbiorem danych dla danego elementu. Tutaj jednak nie wiem, w jaki sposób to ugryźć. 

 

Załączam fragment kodu, który przedstawia ten sposób, że każda informacja na temat jednego studenta jest oddzielnie. Jednak nie jest to rozwiązanie, o które mi chodzi. 

 

using namespace std;

list  <string> lista;
int wybor;

void wyswietl()
{
     system("cls");
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),10);
     cout << "----- BAZA STUDENTOW ------" << endl;
     for(list<string>::iterator i=lista.begin(); i!=lista.end();++i)
          cout <<*i<<" "<< endl;
          cout << endl;
          cout << endl;


}

void push_front()
{
     string numer_albumu, imie, nazwisko, rok, kierunek, specjalnosc;
     cout << "Podaj wszystkie informacje o studencie. << endl;
     cout << "Numer albumu: ";
     cin >> numer_albumu;
     cout << "Imie studenta: ";
     cin >> imie;
     cout << "Nazwisko studenta: ";
     cin >> nazwisko;
     cout << "Rok studiow: ";
     cin >> rok;
     cout << "Kierunek studiow: ";
     cin >> kierunek;
     cout << "Specjalnosc: ";
     cin >> specjalnosc;
     cout << endl;

     lista.push_front(specjalnosc);
     lista.push_front(kierunek);
     lista.push_front(rok);
     lista.push_front(nazwisko);
     lista.push_front(imie);
     lista.push_front(numer_albumu);
}

 

komentarz 27 marca 2017 przez criss Mędrzec (172,590 p.)

W przypadku kiedy sam implementowałem listę stworzyłem po prostu dwie struktury, jedna odpowiadała za samą listę, natomiast druga była po prostu zbiorem danych dla danego elementu.

Dlaczego tutaj nie możesz tak zrobić? 

komentarz 27 marca 2017 przez krzakurts Obywatel (1,470 p.)

Myślałem, że szablon listy daje mi jakieś inne możliwości, którymi powinienem się posłużyć. W takim razie jak mam takie struktury, to jak teraz w odpowiedni sposób skorzystać z funkcji push_front, żeby element miał dane zawarte w strukturze "student" ?
 

struct student{
     string numer_albumu;
     string imie;
     string nazwisko;
     string rok_studiow;
     string kierunek;
     string specjalnosc;

     student *nastepny;  // wskaznik na nastepny element
     student();  // konstruktor

};

student::student(){

nastepny=0;  // konstruktor

}

struct lista{

student *pierwszy; // wskaznik na poczatek listy/pierwszy element

lista();
};

lista::lista(){
pierwszy=0;

}

 

1 odpowiedź

0 głosów
odpowiedź 27 marca 2017 przez criss Mędrzec (172,590 p.)
wybrane 28 marca 2017 przez krzakurts
 
Najlepsza

Niepotrzebny ci żaden wskaźnik na nastepny element. To robi lista, z której ty korzystasz, a nie implementujesz.

Lista jest w rzeczywistości (tak jest implementowana) jako taki "łańcuszek" (każdy element ma wskaźnik na kolejny i ew. na poprzedni), ale nie bezpośrednio elementów typu jaki przetrzymuje, ale jakichś pomocniczych strukturek która zawiera przetrzymywany obiekt (właściwy element) i wspomniane wskaźniki.

Np.:

template<typename T>
class List
{
        struct Node
        {
                Node * next;
                T el;
        };

       Node * m_begin;

// reszta implementacji..
};

Tak dla rozjaśnienia, bo widze, że sie gubisz. Nie wiem czy to cokolwiek pomogło, ale nie chce pisać więcej bo tylko odchodzimy od tematu.

Także mógłbyś to napisać tak:

   struct student{
         string numer_albumu;
         string imie;
         string nazwisko;
         string rok_studiow;
         string kierunek;
         string specjalnosc;
    };

     std::list<student> lista;

     string numer_albumu, imie, nazwisko, rok, kierunek, specjalnosc;
     cout << "Podaj wszystkie informacje o studencie. << endl;
     cout << "Numer albumu: ";
     cin >> numer_albumu;
     cout << "Imie studenta: ";
     cin >> imie;
     cout << "Nazwisko studenta: ";
     cin >> nazwisko;
     cout << "Rok studiow: ";
     cin >> rok;
     cout << "Kierunek studiow: ";
     cin >> kierunek;
     cout << "Specjalnosc: ";
     cin >> specjalnosc;
     cout << endl;

     lista.push_front({numer_albumu, imie, nazwisko, rok, kierunek, specjalnosc});

 

komentarz 28 marca 2017 przez criss Mędrzec (172,590 p.)

A, sorry. Pomyliło mi się.

Tak to powinno wyglądac:

auto it = list.begin();
std::advance(it, n);
*it; // n-ty element
komentarz 28 marca 2017 przez krzakurts Obywatel (1,470 p.)
                    int numer;
                    cout << "Podaj numer elementu, ktory chcesz wyswietlic: ";
                    cin >> numer;
                    auto it= lista.begin();
                    advance(it, numer);
                    cout << *it;

Wszystko ładnie chodzi, tylko jest jeden problem. Kiedy chce chce dostać się do ostatniego elementu, wtedy program się sypie. Da się to w jakiś sposób zabezpieczyć?

komentarz 28 marca 2017 przez criss Mędrzec (172,590 p.)
Widocznie nie próbujesz się dostać do ostatniego, tylko do np. elementu za ostatnim.
komentarz 28 marca 2017 przez krzakurts Obywatel (1,470 p.)
A istnieje metoda, do wstawiania elementu do listy po jakimś wskazanym elemencie?
komentarz 28 marca 2017 przez criss Mędrzec (172,590 p.)

insert

Korzystaj z dokumentacji. Nie musisz o takie rzeczy pytać na forum.

Podobne pytania

0 głosów
1 odpowiedź 359 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)
0 głosów
1 odpowiedź 325 wizyt
0 głosów
2 odpowiedzi 416 wizyt
pytanie zadane 8 lipca 2019 w C i C++ przez niezalogowany

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...