{"id":162,"date":"2021-10-28T11:08:28","date_gmt":"2021-10-28T11:08:28","guid":{"rendered":"https:\/\/solinfo.ro\/blog\/?p=162"},"modified":"2024-05-17T20:31:19","modified_gmt":"2024-05-17T20:31:19","slug":"stl","status":"publish","type":"post","link":"https:\/\/solinfo.ro\/blog\/stl\/","title":{"rendered":"STL \u00een C++"},"content":{"rendered":"\n<p><strong>STL (Standard Template Library)<\/strong> reprezint\u0103 structuri, func\u021bii \u0219i algoritmi care pot fi de ajutor atunci c\u00e2nd avem nevoie s\u0103 cre\u0103m algoritmi rapizi. C\u00e2teva libr\u0103rii din STL sunt <em>&lt;vector><\/em>, <em>&lt;set><\/em>, <em>&lt;unordered_multiset><\/em>, <em>&lt;map><\/em>, \u00eens\u0103 \u00een acest articol vom discuta doar despre primele dou\u0103.<\/p>\n\n\n\n<p>Folosind libr\u0103ria <em>&lt;vector&gt;<\/em>, putem face un <a rel=\"noreferrer noopener\" href=\"https:\/\/www.geeksforgeeks.org\/vector-in-cpp-stl\/\" data-type=\"URL\" data-id=\"https:\/\/www.geeksforgeeks.org\/vector-in-cpp-stl\/\" target=\"_blank\"><strong>vector<\/strong><\/a> care vine automat cu c\u00e2teva func\u021bii ajut\u0103toare. Foarte important este c\u0103 vectorul pe care \u00eel \u0219tie toat\u0103 lumea (<em>int v[50]<\/em>) se nume\u0219te de fapt <a href=\"https:\/\/www.geeksforgeeks.org\/arrays-in-c-cpp\/\" data-type=\"URL\" data-id=\"https:\/\/www.geeksforgeeks.org\/arrays-in-c-cpp\/\"><strong>array<\/strong><\/a> \u0219i nu este la fel cu vectorul din STL. Pentru a include aceast\u0103 libr\u0103rie trebuie s\u0103 introducem <em>#include &lt;vector&gt;<\/em> la \u00eenceputul sursei, iar ca s\u0103 declar\u0103m un vector scriem <em>vector&lt;int&gt; v;<\/em>. Aceast\u0103 scriere va crea un vector numit <em>v<\/em> care va con\u021bine doar elemente de tip <em>int<\/em>. Observ\u0103m c\u0103, la declararea vectorilor \u00een STL, nu trebuie specificat\u0103 dimensiunea vectorului, spre deosebire de declararea unui array. Pentru a accesa elemente \u0219i a atribui valori \u00een vector, sintaxa este la fel ca la un array.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/img.png\" alt=\"\" class=\"wp-image-172\" width=\"709\" height=\"339\"\/><figcaption>Exemplu de algoritm care folose\u0219te vectorii din STL<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/image-10.png\" alt=\"\" class=\"wp-image-173\" width=\"516\" height=\"154\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/image-10.png 375w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/image-10-300x90.png 300w\" sizes=\"auto, (max-width: 516px) 100vw, 516px\" \/><figcaption>Exemplu de date de intrare \u0219i afi\u0219area datelor de ie\u0219ire pentru algoritmul de mai sus<\/figcaption><\/figure><\/div>\n\n\n\n<p>\u00cenainte de descrierea algoritmului de mai sus, trebuie s\u0103 \u0219ti\u021bi c\u0103 vectorii din STL trebuie s\u0103 porneasc\u0103 de la indicele 0 pentru a func\u021biona corespunz\u0103tor. Dac\u0103 prima valoare din vector este pe pozi\u021bia 1, unele func\u021bii nu vor mai returna rezultatul dorit. La \u00eenceputul sursei, se includ libr\u0103riile <em>&lt;iostream><\/em> \u0219i <em>&lt;vector><\/em> pentru a putea citi \u0219i afi\u0219a pe ecran \u0219i pentru a folosi vectorii din STL. \u00cen func\u021bia main, se declar\u0103 un vector \u00een STL <em>v<\/em> care va avea doar elemente de tipul <em>int<\/em>, \u0219i 3 variabile de tipul <em>int<\/em>: <em>n<\/em>, <em>i<\/em> \u0219i <em>x<\/em>. Citim <em>n<\/em> de la tastatur\u0103, care va reprezenta num\u0103rul de elemente pe care le vom citi \u00een continuare. Apoi, de la <em>i=0<\/em> p\u00e2n\u0103 la <em>i=n-1<\/em>, vom citi un num\u0103r \u00een variabila <em>x<\/em>, \u0219i \u00eel vom pune la sf\u00e2r\u0219itul vectorului folosind func\u021bia <strong><em>v.push_back(x)<\/em><\/strong>. Dup\u0103 ce se termin\u0103 bucla anterioar\u0103, elimin\u0103m ultimul element din vector folosind func\u021bia <strong><em>v.pop_back()<\/em><\/strong> \u0219i ad\u0103ug\u0103m la sf\u00e2r\u0219itul vectorului valoarea 5. Practic, \u00eenlocuim ultima valoare cu 5. Dup\u0103 aceasta, elementului de pe pozi\u021bia 2, adic\u0103 elementului al treilea din vector (pentru c\u0103 indexarea \u00eencepe de la 0) i se va atribui valoarea 1, iar apoi se va face afi\u0219area elementelor vectorului astfel: \u201epentru fiecare element <em>nr<\/em> din vectorul <em>v<\/em>, afi\u0219eaz\u0103 nr\u201d. Aceast\u0103 scriere poate fi folositoare, \u0219i uneori obligatorie. auto nr \u00eenseamn\u0103 c\u0103 nu i-am specificat tipul de dat\u0103 variabilei nr \u0219i compilatorul trebuie s\u0103 \u00ee\u0219i dea seama singur ce tip de dat\u0103 are. Sigur c\u0103 auto nr putea fi \u00eenlocuit cu <em>int nr<\/em>, doar c\u0103 acea scriere este mai folosit\u0103, mai ales atunci c\u00e2nd avem de-a face cu iteratori.<\/p>\n\n\n\n<p>La fiecare tip de dat\u0103 din STL exist\u0103 o func\u021bie numit\u0103 <strong><em>size()<\/em><\/strong> care returneaz\u0103 num\u0103rul de elemente din acea structur\u0103 (<em>v.size()<\/em>).<\/p>\n\n\n\n<p>Un <em><a rel=\"noreferrer noopener\" href=\"https:\/\/www.geeksforgeeks.org\/set-in-cpp-stl\/\" data-type=\"URL\" data-id=\"https:\/\/www.geeksforgeeks.org\/set-in-cpp-stl\/\" target=\"_blank\"><strong>set<\/strong><\/a> <\/em>este tot o structur\u0103 de date care memoreaz\u0103 valori, \u00eens\u0103 aceste valori sunt ordonate automat la introducerea lor \u00een acea structur\u0103; de asemenea, dac\u0103 un element introdus exist\u0103 deja \u00een set, nu va mai fi introdus. Cu alte cuvinte, <em>set<\/em> memoreaz\u0103 valori ordonate \u0219i distincte. Exist\u0103 \u0219i <strong><em>unordered_set<\/em><\/strong> (memoreaz\u0103 valori distincte, neordonate), <strong><em>multiset<\/em><\/strong> (memoreaz\u0103 toate valorile, ordonate) \u0219i <strong><em>unordered_multiset<\/em><\/strong> (memoreaz\u0103 toate valorile, neordonate).<\/p>\n\n\n\n<p>La structura STL <em>set<\/em>, accesarea \u0219i atribuirea elementelor nu se mai poate face cu indici (<em>v[5] = 62<\/em>), ci se face doar prin func\u021bii \u0219i prin iteratori.<\/p>\n\n\n\n<p>Un <a rel=\"noreferrer noopener\" href=\"https:\/\/www.geeksforgeeks.org\/iterators-c-stl\/\" data-type=\"URL\" data-id=\"https:\/\/www.geeksforgeeks.org\/iterators-c-stl\/\" target=\"_blank\"><strong>iterator<\/strong><\/a> reprezint\u0103 o por\u021biune din memorie care poate s\u0103 succede sau s\u0103 precede \u00een memorie. Iteratorii sunt specifici pentru fiecare structur\u0103 \u0219i fiecare tip de dat\u0103 din structur\u0103, \u0219i se declar\u0103 cu urm\u0103toarea form\u0103: <strong><em>structur\u0103stl&lt;tipdedat\u0103&gt;::iterator numeiterator;<\/em><\/strong>. Pentru a crea un iterator pentru structura set \u0219i tipul de date <em>int<\/em>, scriem <em>set&lt;int&gt;::iterator itr;<\/em>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/img-1.png\" alt=\"\" class=\"wp-image-175\" width=\"820\" height=\"270\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/img-1.png 967w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/img-1-300x99.png 300w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/img-1-768x253.png 768w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/img-1-500x165.png 500w\" sizes=\"auto, (max-width: 820px) 100vw, 820px\" \/><figcaption>Exemplu de algoritm care folose\u0219te structura set din STL<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/image-11.png\" alt=\"\" class=\"wp-image-176\" width=\"429\" height=\"163\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/image-11.png 375w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/image-11-300x114.png 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><figcaption>Exemplu de date de intrare \u0219i afi\u0219area datelor de ie\u0219ire la programul din exemplul de mai sus<\/figcaption><\/figure><\/div>\n\n\n\n<p>La \u00eenceput, algoritmul de mai sus include libr\u0103riile <em>iostream<\/em> \u0219i <em>set<\/em>. Apoi, \u00een main, se declar\u0103 un set <em>v <\/em>care con\u021bine valori <em>int<\/em>, un iterator <em>itr <\/em>pentru acest set \u0219i 3 variabile <em>int<\/em>: <em>n<\/em>, <em>x<\/em> \u0219i <em>i<\/em>. Dup\u0103 ce se cite\u0219te <em>n <\/em>de la tastatur\u0103, mergem cu un <em>for<\/em> de la <em>i=0<\/em> p\u00e2n\u0103 la <em>i=n-1<\/em>, citim <em>x <\/em>de la tastatur\u0103 \u0219i \u00eel inser\u0103m \u00een set folosind func\u021bia <strong><em>v.insert(x)<\/em><\/strong>. Atunci c\u00e2nd se insereaz\u0103 un element \u00eentr-un set, elementul este a\u0219ezat automat \u00eentr-o pozi\u021bie astfel \u00eenc\u00e2t numerele s\u0103 fie ordonate. Dup\u0103 aceast\u0103 bucl\u0103 <em>for<\/em>, afi\u0219\u0103m <em>n <\/em>\u0219i <em>v.size() <\/em>pentru a compara num\u0103rul de elemente de la \u00eenceput \u0219i num\u0103rul de elemente de la sf\u00e2r\u0219it. La afi\u0219area datelor de ie\u0219ire, observ\u0103m c\u0103 <em>n <\/em>este diferit de <em>v.size()<\/em>. Aceasta se datoreaz\u0103 faptului c\u0103 exist\u0103 2 numere identice \u00een datele de intrare care, odat\u0103 cu \u00eencercarea introducerii am\u00e2ndurora \u00een set, unul nu se va mai insera. Putem vedea acest lucru \u0219i la afi\u0219area elementelor din set, num\u0103rul 56 nefiind afi\u0219at de dou\u0103 ori. \u00cenapoi la algoritm \u2014 observ\u0103m un <em>for <\/em>care atribuie valoarea <strong><em>v.begin()<\/em><\/strong> lui <em>itr<\/em>, compar\u0103 valoarea lui <em>itr <\/em>cu <strong><em>v.end()<\/em><\/strong> \u0219i incrementeaz\u0103 pe <em>itr<\/em> cu 1. Mai jos este o imagine care reprezint\u0103 elementele din set dup\u0103 ce au fost inserate, precum \u0219i unde se afl\u0103 <em>v.begin()<\/em> \u0219i <em>v.end()<\/em>. Un lucru important de re\u021binut este c\u0103 <strong><span style=\"text-decoration: underline\"><em>v.begin()<\/em> \u0219i <em>v.end()<\/em> nu sunt valori<\/span><\/strong>. Acestea reprezint\u0103 doi iteratori cu ajutorul c\u0103rora putem parcurge set-ul, adic\u0103 dou\u0103 puncte \u00een memorie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/Untitled-1.png\" alt=\"\" class=\"wp-image-179\" width=\"508\" height=\"233\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/Untitled-1.png 877w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/Untitled-1-300x138.png 300w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/Untitled-1-768x352.png 768w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2021\/10\/Untitled-1-500x229.png 500w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><\/figure><\/div>\n\n\n\n<p>Atribuim iteratorului nostru <em>itr <\/em>valoarea <em>v.begin()<\/em>, adic\u0103 \u00eei ar\u0103t\u0103m \u00een memorie de unde s\u0103 \u00eenceap\u0103 <em>for<\/em>-ul. Iteratorii pot fi incrementa\u021bi cu 1 folosind operatorul ++, deci \u00eencepem de la <em>v.begin()<\/em>, adun\u0103m iteratorul cu 1 de fiecare dat\u0103, \u0219i trebuie s\u0103 ne oprim cu aceast\u0103 parcurgere atunci c\u00e2nd <em>itr <\/em>ajunge la <em>v.end()<\/em>, deci, ca condi\u021bie pentru <em>for<\/em>, <em>itr != v.end()<\/em>. Forma final\u0103 a <em>for<\/em>-ului este prezentat\u0103 \u00een imaginea cu codul surs\u0103 de mai sus. Pentru a afi\u0219a valoarea iteratorului la care suntem \u00een <em>for<\/em>, folosim <strong>asterisk-ul (*) \u00eenaintea iteratorului<\/strong>. Folosind aceast\u0103 nota\u021bie, compilatorul va \u0219ti c\u0103 vrem valoarea numeric\u0103 din iterator, \u0219i nu locul \u00een memorie unde se afl\u0103 iteratorul. De aceea, \u00een <em>for <\/em>d\u0103m <em>cout <\/em>la <strong><em>*itr<\/em><\/strong>, adic\u0103 la num\u0103rul din locul unde se afl\u0103 iteratorul.<\/p>\n\n\n\n<p>Foarte important de cunoscut este \u0219i structura <a rel=\"noreferrer noopener\" href=\"https:\/\/www.geeksforgeeks.org\/map-associative-containers-the-c-standard-template-library-stl\/\" target=\"_blank\"><strong>map<\/strong><\/a>. Exist\u0103 mult mai multe tipuri de structuri de date \u00een STL, o list\u0103 cu ele o pute\u021bi g\u0103si <a rel=\"noreferrer noopener\" href=\"https:\/\/www.geeksforgeeks.org\/the-c-standard-template-library-stl\/\" data-type=\"URL\" data-id=\"https:\/\/www.geeksforgeeks.org\/the-c-standard-template-library-stl\/\" target=\"_blank\">aici<\/a>.<\/p>\n\n\n\n<p>STL-ul este foarte rapid ca timp de execu\u021bie \u0219i este important s\u0103 \u0219ti\u021bi s\u0103 \u00eel folosi\u021bi c\u00e2nd v\u0103 afla\u021bi la olimpiade sau concursuri de informatic\u0103, sau chiar atunci c\u00e2nd face\u021bi probleme de informatic\u0103 de acas\u0103. Pentru c\u0103 acesta nu se pred\u0103, de obicei, \u00een \u0219coli, trebuie s\u0103 citi\u021bi \u0219i s\u0103 \u00eenv\u0103\u021ba\u021bi de pe internet aceste no\u021biuni elementare ale limbajului C++. Spor la \u00eenv\u0103\u021bat!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Acest articol prezint\u0103 c\u00e2teva noi tipuri de date care sunt de ajutor la rezolvarea problemelor de informatic\u0103.<\/p>\n","protected":false},"author":4,"featured_media":188,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43,44],"tags":[39,19,38,36,37],"class_list":["post-162","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cpp","category-stl","tag-array","tag-c","tag-set","tag-stl","tag-vector"],"_links":{"self":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/comments?post=162"}],"version-history":[{"count":14,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions"}],"predecessor-version":[{"id":271,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions\/271"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/media\/188"}],"wp:attachment":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/media?parent=162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/categories?post=162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/tags?post=162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}