Listy STL w c++

0

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

1

https://en.cppreference.com/w/
Tutaj najlepiej. Wszystkie elementy języka opisane, w tym także kontenery. ;)

1

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ł

0

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;

}
0

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

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;
}```

0

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

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

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

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.

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