This shows you the differences between two versions of the page.
|
poo-is-ab:laboratoare:11 [2024/12/08 18:34] razvan.cristea0106 [De ce să folosim STL?] |
poo-is-ab:laboratoare:11 [2025/12/04 10:40] (current) razvan.cristea0106 [Algoritmi] |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| Studentul va fi capabil la finalul acestui laborator să: | Studentul va fi capabil la finalul acestui laborator să: | ||
| - | * înțeleagă importanța conceptului de programare modernă în C++ și avantajele oferite de utilizarea bibliotecii STL. | + | * înțeleagă importanța conceptului de programare modernă în C++ și avantajele oferite de utilizarea bibliotecii STL |
| - | * recunoască și să explice clasele și componentele principale din biblioteca STL. | + | * recunoască și să explice clasele și componentele principale din biblioteca STL |
| - | * utilizeze eficient diverse structuri de date și algoritmi disponibili în STL pentru rezolvarea unor probleme concrete. | + | * utilizeze eficient diverse structuri de date și algoritmi disponibili în STL pentru rezolvarea unor probleme concrete |
| - | * aplice principiile și cunoștințele dobândite anterior în programare pentru a dezvolta soluții robuste și eficiente folosind STL. | + | * aplice principiile și cunoștințele dobândite anterior în programare pentru a dezvolta soluții robuste și eficiente folosind STL |
| - | * identifice și să utilizeze algoritmi standard din STL pentru a optimiza procesele și pentru a simplifica implementarea unor operații complexe. | + | * identifice și să utilizeze algoritmi standard din STL pentru a optimiza procesele și pentru a simplifica implementarea unor operații complexe |
| - | + | ||
| ==== Introducere ==== | ==== Introducere ==== | ||
| Line 27: | Line 27: | ||
| Această introducere a **STL-ului** a reprezentat un moment revoluționar în istoria limbajului, oferind programatorilor un set bogat de structuri de date generice (precum **vectori**, **liste**, **seturi**, și **map-uri**), algoritmi și funcționalități asociative, toate bazate pe concepte precum **template-uri** și **iteratori**. | Această introducere a **STL-ului** a reprezentat un moment revoluționar în istoria limbajului, oferind programatorilor un set bogat de structuri de date generice (precum **vectori**, **liste**, **seturi**, și **map-uri**), algoritmi și funcționalități asociative, toate bazate pe concepte precum **template-uri** și **iteratori**. | ||
| - | De atunci, **STL-ul** a evoluat și a fost extins în versiunile ulterioare ale standardului **C++ (C++11, C++14, C++17, C++20, etc.)**, fiind integrată cu noile caracteristici ale limbajului. | + | De atunci, **STL-ul** a evoluat și a fost extins în versiunile ulterioare ale standardului **C++ (C++11, C++14, C++17, C++20, C++23)**, fiind integrată cu noile caracteristici ale limbajului. |
| ==== De ce să folosim STL? ==== | ==== De ce să folosim STL? ==== | ||
| Line 43: | Line 43: | ||
| ==== ==== | ==== ==== | ||
| - | Pe scurt, **STL-ul** ne ajută să scriem un cod **robust**, **eficient** și **ușor de înțeles**, economisind timp prețios în procesul de dezvoltare. Totuși trebie menționat că o bună cunoaștere a conceptului de **structuri de date și algoritmi** va simplifca masiv înțelegerea modului în care componentele acestei biblioteci funcționează. | + | Pe scurt, **STL-ul** ne ajută să scriem un cod **robust**, **eficient** și **ușor de înțeles**, economisind timp prețios în procesul de dezvoltare. Totuși trebuie menționat faptul că o bună cunoaștere a conceptului de **structuri de date și algoritmi** va simplifca masiv înțelegerea modului în care componentele acestei biblioteci funcționează. |
| ==== Alcătuirea bibliotecii standard din C++ ==== | ==== Alcătuirea bibliotecii standard din C++ ==== | ||
| Line 78: | Line 78: | ||
| | **at()** | Returnează caracterul de la o poziție specifică (cu verificare de limite). | | | **at()** | Returnează caracterul de la o poziție specifică (cu verificare de limite). | | ||
| | **operator=** | Atribuie un string altui string. | | | **operator=** | Atribuie un string altui string. | | ||
| - | | **operator[]** | Returnează caracterul de la o poziție specifică (fără verificare de limite). | | + | | **operator[ ]** | Returnează caracterul de la o poziție specifică (fără verificare de limite). | |
| | **operator+** | Concatenează două stringuri sau un string și un șir de caractere. | | | **operator+** | Concatenează două stringuri sau un string și un șir de caractere. | | ||
| | **operator+=** | Adaugă un string sau un șir de caractere la stringul curent. | | | **operator+=** | Adaugă un string sau un șir de caractere la stringul curent. | | ||
| Line 164: | Line 164: | ||
| </code> | </code> | ||
| + | <note tip>Pentru toate metodele și operatorii puși la dispoziție de clasa **string** recomandăm citirea documentației oficiale care se poate găsi chiar [[https://en.cppreference.com/w/cpp/string/basic_string|aici]].</note> | ||
| ==== Standard Template Library ==== | ==== Standard Template Library ==== | ||
| Line 200: | Line 201: | ||
| * **std::list**: Un container bazat pe o **listă dublu înlănțuită**, care permite **adăugarea** și **ștergerea rapidă** a elementelor la **orice poziție** din listă (**O(1)** pentru inserare/ștergere, **O(n)** pentru accesul la elemente). | * **std::list**: Un container bazat pe o **listă dublu înlănțuită**, care permite **adăugarea** și **ștergerea rapidă** a elementelor la **orice poziție** din listă (**O(1)** pentru inserare/ștergere, **O(n)** pentru accesul la elemente). | ||
| - | * **C++11: std::array**: Un container care stochează un **număr fix** de elemente într-un **bloc contigu** de memorie, fiind similar cu un **tablou static**, dar cu funcționalități suplimentare specifice **STL-ului**. | + | * **std::array**: Un container care stochează un **număr fix** de elemente într-un **bloc contigu** de memorie, fiind similar cu un **tablou static**, dar cu funcționalități suplimentare specifice **STL-ului**. |
| - | * **C++11: std::forward_list**: O **listă simplu înlănțuită** care economisește memorie față de **std::list**, fiind mai **eficientă** pentru **inserări** și **ștergeri** la începutul listei, dar **fără acces direct** la elemente intermediare. | + | * **std::forward_list**: O **listă simplu înlănțuită** care economisește memorie față de **std::list**, fiind mai **eficientă** pentru **inserări** și **ștergeri** la începutul listei, dar **fără acces direct** la elemente intermediare. |
| === Adaptoare de Containere (Container Adaptors) === | === Adaptoare de Containere (Container Adaptors) === | ||
| Line 256: | Line 257: | ||
| | **pop_back()** | Elimină ultimul element din vector. | | | **pop_back()** | Elimină ultimul element din vector. | | ||
| | **at()** | Returnează elementul de la o anumită poziție, cu verificare de limite. | | | **at()** | Returnează elementul de la o anumită poziție, cu verificare de limite. | | ||
| - | | **operator[]** | Returnează elementul de la o anumită poziție, fără verificare de limite. | | + | | **operator[ ]** | Returnează elementul de la o anumită poziție, fără verificare de limite. | |
| | **size()** | Returnează numărul curent de elemente din vector. | | | **size()** | Returnează numărul curent de elemente din vector. | | ||
| | **capacity()** | Returnează capacitatea totală a vectorului, adică numărul maxim de elemente pe care le poate stoca fără a realoca memorie. | | | **capacity()** | Returnează capacitatea totală a vectorului, adică numărul maxim de elemente pe care le poate stoca fără a realoca memorie. | | ||
| Line 482: | Line 483: | ||
| <note warning>Clasele **stack**, **queue** și respectiv **priority_queue** nu au iteratori puși la dispoziție deoarce singurele operații permise asupra acestor structuri de date sunt cele de **push** și **pop**.</note> | <note warning>Clasele **stack**, **queue** și respectiv **priority_queue** nu au iteratori puși la dispoziție deoarce singurele operații permise asupra acestor structuri de date sunt cele de **push** și **pop**.</note> | ||
| - | <note tip>Pentru mai multe detalii despre clasele **stack**, **queue** și **priority_queue** recomandăm următoarele documentații: | + | <note tip>Pentru mai multe detalii despre clasele **stack**, **queue** și **priority_queue** recomandăm citirea următoarelor documentații oficiale: |
| * pentru stivă puteți citi de [[https://en.cppreference.com/w/cpp/container/stack|aici]]; | * pentru stivă puteți citi de [[https://en.cppreference.com/w/cpp/container/stack|aici]]; | ||
| Line 495: | Line 496: | ||
| ^ Denumire metodă/Operator ^ Descriere ^ | ^ Denumire metodă/Operator ^ Descriere ^ | ||
| - | | **operator[]** | Accesează sau inserează un element cu cheia specificată. | | + | | **operator[ ]** | Accesează sau inserează un element cu cheia specificată. | |
| | **at()** | Returnează o referință la valoarea asociată unei chei, aruncând o excepție dacă cheia nu există. | | | **at()** | Returnează o referință la valoarea asociată unei chei, aruncând o excepție dacă cheia nu există. | | ||
| | **insert()** | Inserează un element (pereche cheie-valoare) în map. | | | **insert()** | Inserează un element (pereche cheie-valoare) în map. | | ||
| Line 614: | Line 615: | ||
| </code> | </code> | ||
| - | <note tip>Pentru mai multe detalii despre clasele **map** și **set** recomandăm următoarele documentații: | + | <note tip>Pentru mai multe detalii despre clasele **map** și **set** recomandăm citirea următoarelor documentații oficiale: |
| * pentru mapă puteți citi de [[https://en.cppreference.com/w/cpp/container/map|aici]]; | * pentru mapă puteți citi de [[https://en.cppreference.com/w/cpp/container/map|aici]]; | ||
| Line 622: | Line 623: | ||
| ==== Algoritmi ==== | ==== Algoritmi ==== | ||
| - | Pentru a folosi algoritmii din **STL** vom include fișierul antet **''#include <algorithm>''**. Aceast fișier cuprinde algoritmi de **sortare**, **căutare**, **numărare** și mulți alții pe care **nu** mai trebuie să îi rescriem noi de la zero. Propunem un exemplu simplu de utlizare a funcțiilor **sort** și **count** în următorul bloc de cod C++. | + | Pentru a folosi algoritmii din **STL** vom include fișierul antet **''algorithm''**. Aceast fișier cuprinde algoritmi de **sortare**, **căutare**, **numărare** și mulți alții pe care **nu** mai trebuie să îi rescriem noi de la **zero**. Propunem un exemplu simplu de utlizare a funcțiilor **sort** și **count** în următorul bloc de cod C++. |
| <code cpp> | <code cpp> | ||
| Line 661: | Line 662: | ||
| </code> | </code> | ||
| - | <note tip>Pentru mai mulți algoritmi puși la dispoziție de această librarie recomandăm citirea documentației care se află chiar [[https://en.cppreference.com/w/cpp/algorithm|aici]].</note> | + | <note tip>Pentru mai mulți algoritmi puși la dispoziție de această librărie recomandăm citirea documentației oficiale care se află chiar [[https://en.cppreference.com/w/cpp/algorithm|aici]].</note> |
| ==== Concluzii ==== | ==== Concluzii ==== | ||