Witam, szukam informacji na temat list w c++. Głównie STL. Podstawy itd. Zna ktoś dobrą stronkę, książke, kurs, filmiki na yt które dobrze i dosyć prosto przedstawiają temat?
Dziękuje za wszelką pomoc :)
https://en.cppreference.com/w/
Tutaj najlepiej. Wszystkie elementy języka opisane, w tym także kontenery. ;)
Polecam stworzyć sobie w ulubionym edytorze tekstu (mój ulubiony kwrite) taki szablonik:
#include <iostream>
#include <list>
#include <string.h>
template <typename T>
void my_list(T list);
struct myType {
double latitude;
double longitude;
};
int main()
{
std::list<int> l{ 7, 5, 16, 8 };
std::list<std::string> m{"maslo", "ciaslo", "sraslo", "daslo"};
std::list<char> n{'a', 'b', 'c', 'd'};
std::list<myType> o{{1.0, 1.5}, {2.0, 2.5}, {3.0, 3.5}};
my_list(l);
my_list(m);
my_list(n);
my_list(o);
}
template <typename T>
void my_list(T list)
{
//...
}
w zakładce w firefox lub chrome odpalić dokumentację https://en.cppreference.com/w/cpp/container/list i w miejsce kropek testować funkcje listy :)
ps. W razie potrzeby korzystać z translate.google.pl, bo Polak to Polak, nie każdy Anglikiem się urodził
Dziękuje za wszelkie odpowiedzi ogólnie mierze się z pewnym zadaniem.
Napisz program, w którym do listy tablicowej dodawane są trzy obiekty agregatu Osoba (trzy pola: imię, nazwisko, wiek) i lista jest drukowana przeciąż operator wyjścia w agregacie Osoba.
Jak na razie wykleciłem coś takiego. Jest ktoś w stanie mi pomóc napisać wyświetlanie tej listy?
kod:
#include <algorithm>
#include <iostream>
#include <list>
using namespace std;
class Osoba{
public:
string imie,nazwisko;
int wiek;
void wypisz() {
cout << imie << " " << nazwisko << " ma lat " << wiek;
}
};
int main()
{
// Create a list containing integers
Osoba o1 = {"Jan","Kowalski",31};
Osoba o2 = { "Adam","Lski",32 };
Osoba o3 = { "Piotr","Kowal",33 };
list<Osoba> lista = { o1,o2,o3 };
lista.push_front({"Gosia","Duda",25});
list<int>::iterator it;
for (it = lista.pop_front(); it != lista.end(); it++)
cout << *it;
}
Wyświetlanie można zrealizować zakresową pętlą for.
for (auto el : lista)
cout << el;
Niemniej aby było to możliwe z użyciem std::cout
, musisz przeciążyć operator <<
dla swojej klasy.
https://dsp.krzaq.cc/post/304/jak-przeladowywac-operatory-w-mojej-klasie
E:
Można iść po linii najmniejszego oporu i skorzystać z Twojej metody wypisz().
for (auto el : lista)
el.wypisz();
Super dzięki naprawdę mi pomogłeś. Jeszcze jedno, chyba ostatnie pytanie.
Czy w lini od 13 do 17 da się to jakoś bardziej zwięźle napisać? Ewentualnie czy mógłbyś trochę mi ten kawałek wytłumaczyć?
- w sumie linia 29 chyba nie jest już potrzebna. Jeśli zadaje banalne i głupie pytania to bardzo przepraszam.
#include <iostream>
#include <list>
using namespace std;
class Osoba{
public:
string imie,nazwisko;
int wiek;
void wypisz() {
cout << imie << " " << nazwisko << " ma lat " << wiek;
}
friend ostream& operator<<(ostream& o, Osoba const& f)
{
return o << f.imie << " " << f.nazwisko<<" "<<f.wiek<<endl;
}
};
int main()
{
// Create a list containing integers
Osoba o1 = {"Jan","Kowalski",31};
Osoba o2 = { "Adam","Lski",32 };
Osoba o3 = { "Piotr","Kowal",33 };
list<Osoba> lista = { o1,o2,o3 };
lista.push_front({"Gosia","Duda",25});
list<int>::iterator it;
for (auto it : lista)
cout << it;
}```
Linia 29 jest zbędna.
Co do pierwszego pytania - nie sądzę - to znaczy, jest to raczej kwestia preferencji. Dla przykładu ja zapisałem sobie ten operator tak:
friend std::ostream& operator<<(std::ostream& os, const Osoba& o)
{
os << "Imie:" << o.imie << '\n';
os << "Nazwisko: " << o.nazwisko << '\n';
os << "Wiek: " << o.wiek << '\n';
return os;
}
@Loraxor:
Dodaj #include <string>
. bo poleganie wyłącznie na iostream może być zgubne
Funkcję wypisz
możesz usunąć.
Zmiennych o1
, o2
i o3
używasz tylko przy tworzeniu listy, więc zapis możesz skrócić do:
list<Osoba> lista{{"Adam", "Kowalski", 30}, {"Adam", "Lski", 32}, {"Piotr", "Kowal", 33}};
Przy wypisywaniu nie modyfikujesz obiektów, więc dodaj const
for (const auto& osoba : lista)
{
cout << osoba;
}
Dzięki @tajny_agent za podpowiedzi. Takie moje jeszcze pytanie. Jakby miałaby wyglądać funkcja dodająca coś do tej listy?
Miałem taki pomysł, ale on nie działa:
lista.insert({ "aba","cos",21 });
A jak chcesz po prostu dodać element na końcu listy to skorzystaj z typowej funkcji kontenera czyli push_back. Dla listy to będzie wydajniejsze niż jeżdżenie po indeksach.