{"id":1490,"date":"2019-04-18T12:23:39","date_gmt":"2019-04-18T10:23:39","guid":{"rendered":"https:\/\/www.kompikownia.pl\/?p=1490"},"modified":"2019-04-18T12:23:41","modified_gmt":"2019-04-18T10:23:41","slug":"poznaj-nowoczesna-tablice-vector-w-c","status":"publish","type":"post","link":"https:\/\/www.kompikownia.pl\/index.php\/2019\/04\/18\/poznaj-nowoczesna-tablice-vector-w-c\/","title":{"rendered":"Poznaj nowoczesn\u0105 tablic\u0119 &#8211; vector w C++"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">4<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span>\n<p>W swoich programach z pewno\u015bci\u0105 przechowujesz r\u00f3\u017cne dane. Wykonujesz na nich r\u00f3\u017cne operacje i przekszta\u0142cenia. Pozna\u0142e\u015b do tej pory co\u015b takiego jak &#8222;tablica&#8221; (np.: int array[n]), kt\u00f3ra s\u0142u\u017cy do przechowywania okre\u015blonej ilo\u015bci element\u00f3w danego typu. Tablice by\u0142y dobre, ale w latach 90. Obecnie posiadaj\u0105 one wiele wad. Jedn\u0105 z najwa\u017cniejszych jest sta\u0142y rozmiar. A przecie\u017c zdarzaj\u0105 si\u0119 sytuacje kiedy nie mo\u017cemy etapie kodowania przewidzie\u0107 ile danych wprowadzi u\u017cytkownik. Innym niezaprzeczalnym problemem jest mo\u017cliwo\u015b\u0107 nie\u015bwiadomego doprowadzenia do naruszenia ochrony pami\u0119ci &#8211; zwyk\u0142a tablica nie pozwala m.in. na sprawdzenie jej rozmiaru. Nie polecam ich u\u017cywa\u0107 tym bardziej, \u017ce we wsp\u00f3\u0142czesnym j\u0119zyku C++ s\u0105 dost\u0119pne du\u017co lepsze i wygodniejsze zamienniki. Jednym z takich nast\u0119pc\u00f3w, kt\u00f3rymi zajmiemy si\u0119 w dzisiejszym wpisie jest kontener vector. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vector C++ &#8211; podstawy<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Konstruktor<\/h3>\n\n\n\n<p>Najprostsz\u0105 kolekcj\u0119 typu vector mo\u017cna utworzy\u0107 za pomoc\u0105 nast\u0119puj\u0105cej linijki kodu: <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector <span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> vec<span class=\"sy4\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Na pocz\u0105tku podajemy oczywi\u015bcie typ obiektu. W naszym wypadku jest to vector. Co znajduje si\u0119 w nawiasach tr\u00f3jk\u0105tnych? Typ danych, kt\u00f3ry b\u0119dziemy przechowywali. Mo\u017cemy tam wstawi\u0107 dowolny typ liczbowy, tekstowy lub klas\u0119. Vector mo\u017ce przechowywa\u0107 absolutnie wszystko. Oczywi\u015bcie, vector przechowuj\u0105cy obiekty klasy &lt;MyClass&gt; nie b\u0119dzie m\u00f3g\u0142 przechowywa\u0107 liczb ca\u0142kowitych. Dana kolekcja mo\u017ce przechowywa\u0107 tylko dane jednego rodzaju.<\/p>\n\n\n\n<p>vec jest nazw\u0105 naszej zmiennej. <\/p>\n\n\n\n<p>Kolekcja vector posiada tak\u017ce kilka innych sposob\u00f3w deklaracji i inicjacji. Niekt\u00f3re pozosta\u0142e cz\u0119sto u\u017cywane metody znajduj\u0105 si\u0119 na poni\u017cszym listingu. <\/p>\n\n\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v1<span class=\"sy4\">;<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v2<span class=\"br0\">&#40;<\/span><span class=\"nu0\">50<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v3<span class=\"br0\">&#40;<\/span><span class=\"nu0\">4<\/span>,<span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v4<span class=\"br0\">&#40;<\/span>v3.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>,v3.<span class=\"me1\">end<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v5<span class=\"br0\">&#40;<\/span>v3<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v6 <span class=\"br0\">&#123;<\/span><span class=\"nu0\">5<\/span>,<span class=\"nu0\">10<\/span>,<span class=\"nu0\">15<\/span><span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p>Na powy\u017cszym listingu widzisz najcz\u0119\u015bciej u\u017cywane sposoby na utworzenie vectora. W kolejno\u015bci od pierwszej do ostatniej linijki oznaczaj\u0105 one kontener:<\/p>\n\n\n\n<ul><li>pusty<\/li><li>o &#8222;okre\u015blonym&#8221; pocz\u0105tkowym rozmiarze wynosz\u0105cym 50 element\u00f3w<\/li><li>wype\u0142niony okre\u015blon\u0105 ilo\u015bci\u0105 kopii danego elementu (4 elementy o warto\u015bci 100)<\/li><li>kt\u00f3ry zawiera kopi\u0119 element\u00f3w innego vectora<\/li><li>kt\u00f3ry zawiera kopi\u0119 element\u00f3w innego vectora (spos\u00f3b drugi) <\/li><li>wype\u0142niony okre\u015blonymi elementami za pomoc\u0105 listy inicjalizacyjnej (<a href=\"https:\/\/www.kompikownia.pl\/index.php\/2018\/11\/09\/uniform-initialization-prostota-wypelniania-struktur-danych\/\">sp\u00f3jrz na wpis o uniform initialization<\/a>).<\/li><\/ul>\n\n\n\n<p>Najcz\u0119\u015bciej b\u0119dziemy u\u017cywali sposobu nr 1 i nr 5 i nr 6. S\u0105 one najbardziej intuicyjne. Za pomoc\u0105 sposobu nr 2 mo\u017cemy powiedzie\u0107 vectorowi, ile mniej wi\u0119cej element\u00f3w b\u0119dzie mia\u0142a nasza kolekcja. Dzi\u0119ki temu mo\u017cemy nieco przyspieszy\u0107 program. Poza tym jest to dobry spos\u00f3b na zagi\u0119cie kogo\u015b w testach \ud83d\ude42 Spos\u00f3b nr 4 wykorzystuje iteratory, kt\u00f3re poznamy za chwilk\u0119. Spos\u00f3b nr 5 korzysta z listy inicjalizacyjnej. Elementy podane w nawiasach klamrowych b\u0119d\u0105 dodane do vectora w ramach jego inicjacji. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Czym jest iterator?<\/h3>\n\n\n\n<p>Iterator jest &#8222;wska\u017anikiem&#8221; na okre\u015blony element vectora. Iteratory pozwalaj\u0105 \u0142atwo porusza\u0107 si\u0119 po kolekcji. Na pocz\u0105tku mog\u0105 wydawa\u0107 si\u0119 nieco ci\u0119\u017ckie do zrozumienia, ale wystarczy nieco wprawy i b\u0119dziesz wiedzia\u0142 o co w nich chodzi. Ka\u017cdy vector posiada kilka &#8222;domy\u015blnych&#8221; iterator\u00f3w, kt\u00f3re zawsze istniej\u0105 i wskazuj\u0105 na pewne charakterystyczne elementy. Nam w tej chwili b\u0119d\u0105 potrzebne dwa, kt\u00f3re s\u0105 widoczne na poni\u017cszym listingu, pozosta\u0142e poznasz nieco p\u00f3\u017aniej. <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> vec<span class=\"sy4\">;<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span><span class=\"sy4\">::<\/span><span class=\"me2\">iterator<\/span> iter1 <span class=\"sy1\">=<\/span> vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span><span class=\"sy4\">::<\/span><span class=\"me2\">iterator<\/span> iter2 <span class=\"sy1\">=<\/span> vec.<span class=\"me1\">end<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"example_code\">Sp\u00f3jrz na linijk\u0119 drug\u0105. Utworzyli\u015bmy w niej iterator iter1 przypisali\u015bmy do niego to, co zwraca metoda <em>begin().<\/em> Iterator zwracany przez t\u0119 metod\u0119 zawsze b\u0119dzie wskazywa\u0142 na pierwszy element vectora vec. Innymi s\u0142owy na ten, kt\u00f3ry znajduje si\u0119 pod indeksem nr 0. <\/p>\n\n\n\n<p class=\"example_code\">Inaczej zachowywa\u0107 si\u0119 b\u0119dzie iterator iter2. Metoda <em>end() <\/em>zwr\u00f3ci iterator wskazuj\u0105cy element znajduj\u0105cy si\u0119 <strong>za ostatnim elementem kolekcji<\/strong>. O ile mo\u017cemy odczyta\u0107 element zwracany przez <em>begin()<\/em> za pomoc\u0105 wy\u0142uskania, o tyle nie polecam robienia tego samego z iteratorem <em>end()<\/em> gdy\u017c doprowadzisz do naruszenia ochrony pami\u0119ci.  <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dodawanie element\u00f3w<\/h3>\n\n\n\n<p>Vector jest najbardziej uniwersaln\u0105 struktur\u0105. Pozwala na dodawanie element\u00f3w praktycznie w dowolnym miejscu. Oczywi\u015bcie, ze wzgl\u0119du na swoj\u0105 uniwersalno\u015b\u0107 vector mo\u017ce by\u0107 nieco wolniejszy od struktur takich jak lista, kolejka czy stos, kt\u00f3re w tym wzgl\u0119dzie nak\u0142adaj\u0105 pewne ograniczenia. <\/p>\n\n\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v1<span class=\"sy4\">;<\/span><br \/>\nv1.<span class=\"me1\">push_back<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">10<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nv1.<span class=\"me1\">insert<\/span><span class=\"br0\">&#40;<\/span>v1.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>,<span class=\"nu0\">30<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nv1.<span class=\"me1\">push_back<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">20<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nv1.<span class=\"me1\">insert<\/span><span class=\"br0\">&#40;<\/span>v1.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">40<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p class=\"example_code\">Elementy do vectora naj\u0142atwiej dodaje si\u0119 na jego ko\u0144cu. Korzystamy wtedy z metody <em>push_back<\/em>(), podaj\u0105c jako argument element lub obiekt, kt\u00f3ry chcemy doda\u0107 do vectora. Je\u015bli odczuwasz potrzeb\u0119 dodania elementu w jakim\u015b innym miejscu, u\u017cyj metody <em>insert<\/em>. Jako pierwszy argument podajemy iterator vectora. Natomiast drugie miejsce zajmuje warto\u015b\u0107 lub obiekt, kt\u00f3ry chcemy doda\u0107. <\/p>\n\n\n\n<p class=\"example_code\">Co oznacza zapis <em>v1.begin()?<\/em> Metoda <em>begin<\/em> zwraca iterator wskazuj\u0105cy na pierwszy element. Oznacza to, \u017ce je\u015bli wykonamy metod\u0119 <em>insert<\/em> i podamy jako argument <em>v1.begin(),<\/em> to nowy element zostanie dodany pod indeksem nr 0. Wszystkie aktualnie istniej\u0105ce zostan\u0105 przesuni\u0119te o jeden w prz\u00f3d. Analogicznie, zapis <em>v1.begin()+1<\/em> oznacza, \u017ce chcemy zapisa\u0107 element pod indeksem nr 1. <\/p>\n\n\n\n<p><strong>Zagadka:  <\/strong>Jaka b\u0119dzie warto\u015b\u0107 vectora v1 w powy\u017cszym listingu? <br><\/p>\n\n\n<span class=\"collapseomatic \" id=\"id69e09035d751c\"  tabindex=\"0\" title=\"Zagadka 1 - odpowied\u017a\"    >Zagadka 1 - odpowied\u017a<\/span><div id=\"target-id69e09035d751c\" class=\"collapseomatic_content \">\n30 40 10<br \/>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Usuwanie element\u00f3w<\/h3>\n\n\n\n<p>Aby usun\u0105\u0107 element z vectora, b\u0119dziemy musieli skorzysta\u0107 z pomocy iterator\u00f3w. Sp\u00f3jrz na poni\u017cszy listing<\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> vec <span class=\"br0\">&#123;<\/span><span class=\"nu0\">30<\/span>, <span class=\"nu0\">40<\/span>, <span class=\"nu0\">50<\/span>, <span class=\"nu0\">60<\/span>, <span class=\"nu0\">70<\/span>, <span class=\"nu0\">80<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span><br \/>\nvec.<span class=\"me1\">erase<\/span><span class=\"br0\">&#40;<\/span>vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"co1\">\/\/ zostanie usuni\u0119ty element vec[1], czyli liczba 40. Vector po usuni\u0119ciu b\u0119dzie zawiera\u0142 warto\u015bci [30,50,60,70,80]<\/span><br \/>\nvector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> vec2<span class=\"br0\">&#40;<\/span><span class=\"nu0\">30<\/span>,<span class=\"nu0\">40<\/span>,<span class=\"nu0\">50<\/span>,<span class=\"nu0\">60<\/span>,<span class=\"nu0\">70<\/span>,<span class=\"nu0\">80<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvec.<span class=\"me1\">erase<\/span><span class=\"br0\">&#40;<\/span>vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">2<\/span>,vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">4<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"co1\">\/\/ zostan\u0105 usuni\u0119te elementy vec[2], vec[3]. Vector po usuni\u0119ciu b\u0119dzie zawiera\u0142 warto\u015bci [30,40,70,80]<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"example_code\">Jak pewnie zauwa\u017cy\u0142e\u015b, do usuwania element\u00f3w z vectora s\u0142u\u017cy metoda <em>erase.<\/em> Wyst\u0119puje ona w dw\u00f3ch wariantach.<\/p>\n\n\n\n<ul><li>Wariant 1 (linijka 2) &#8211; usuwa element wskazywany przez iterator podany jako argument<\/li><li>Wariant 2 (linijka 3) &#8211; usuwa elementy znajduj\u0105ce si\u0119 pomi\u0119dzy iteratorami podanymi jako argument pierwszy (w\u0142\u0105cznie) i drugi (wy\u0142\u0105cznie).<\/li><\/ul>\n\n\n\n<p class=\"example_code\">O ile wariant pierwszy jest \u0142atwy do zrozumienia, gdy\u017c dzia\u0142a analogicznie do metody <em>insert<\/em> o tyle wariant drugi mo\u017ce by\u0107 nieco trudniejszy. Zapis <em>vec.erase(begin()+2, vec.begin()+4) <\/em>oznacza, \u017ce zostan\u0105 usuni\u0119te elementy znajduj\u0105ce si\u0119 pod indeksami 2 i 3. Element wskazywany przez drugi iterator stanowi granic\u0119 przedzia\u0142u ale nie znajduje si\u0119 w nim, dlatego nie zostanie usuni\u0119ty. <\/p>\n\n\n\n<p><strong>Zagadka:<\/strong> Sp\u00f3jrz na poni\u017cszy listing<\/p>\n\n\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> vec <span class=\"br0\">&#123;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">2<\/span>,<span class=\"nu0\">3<\/span>,<span class=\"nu0\">4<\/span>,<span class=\"nu0\">5<\/span>,<span class=\"nu0\">6<\/span>,<span class=\"nu0\">7<\/span>,<span class=\"nu0\">8<\/span>,<span class=\"nu0\">9<\/span>,<span class=\"nu0\">10<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span><br \/>\nvec.<span class=\"me1\">erase<\/span><span class=\"br0\">&#40;<\/span>vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvec.<span class=\"me1\">erase<\/span><span class=\"br0\">&#40;<\/span>vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">2<\/span>,vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">4<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvec.<span class=\"me1\">erase<\/span><span class=\"br0\">&#40;<\/span>vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">1<\/span>,vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\nvec.<span class=\"me1\">erase<\/span><span class=\"br0\">&#40;<\/span>vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy2\">+<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p>Jaka b\u0119dzie ostateczna zawarto\u015b\u0107 vectora vec? <\/p>\n\n\n<span class=\"collapseomatic \" id=\"id69e09035d759f\"  tabindex=\"0\" title=\"Zagadka 2 - odpowied\u017a\"    >Zagadka 2 - odpowied\u017a<\/span><div id=\"target-id69e09035d759f\" class=\"collapseomatic_content \">\n1 6 7 9 10<br \/>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Wy\u015bwietlanie element\u00f3w vectora<\/h3>\n\n\n\n<p>Elementy znajduj\u0105ce si\u0119 w kontenerze vector mo\u017cemy wy\u015bwietli\u0107 na kilka sposob\u00f3w. Poka\u017c\u0119 tutaj trzy najpopularniejsze.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Spos\u00f3b I &#8211; zwyk\u0142y for<\/h4>\n\n\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v <span class=\"br0\">&#123;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">2<\/span>,<span class=\"nu0\">3<\/span>,<span class=\"nu0\">4<\/span>,<span class=\"nu0\">5<\/span>,<span class=\"nu0\">6<\/span>,<span class=\"nu0\">7<\/span>,<span class=\"nu0\">8<\/span>,<span class=\"nu0\">9<\/span>,<span class=\"nu0\">10<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy1\">&lt;<\/span>v.<span class=\"me1\">size<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>i<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">cout<\/span><span class=\"sy1\">&lt;&lt;<\/span>v<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"sy1\">&lt;&lt;<\/span>endl<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p class=\"example_code\">Jak zauwa\u017camy, metoda opiera si\u0119 na tradycyjnej p\u0119tli for. Po prostu przechodzimy po kolei przez wszystkie elementy kontenera. Widzimy, jak bardzo przydatne s\u0105 metody wprowadzone przez tw\u00f3rc\u00f3w standardu. W przypadku zwyk\u0142ej tablicy musieliby\u015bmy pami\u0119ta\u0107 gdzie\u015b jej rozmiar. Vector robi to za nas. Udost\u0119pnia metod\u0119 <em>size()<\/em>. Zwraca ona zwraca ilo\u015b\u0107 element\u00f3w znajduj\u0105cych si\u0119 w vectorze. Dzi\u0119ki temu zabezpieczamy si\u0119 przed tym, aby nie wyj\u015b\u0107 poza obszar nale\u017c\u0105cy do kontenera. Przyk\u0142ad pokazuje tak\u017ce, \u017ce dost\u0119p do element\u00f3w vectora jest dok\u0142adnie taki sam jak do element\u00f3w zwyk\u0142ej tablicy. Tutaj tak\u017ce u\u017cywamy nawias\u00f3w kwadratowych [], aby odczyta\u0107 konkretny element.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Spos\u00f3b II &#8211; range-based loop<\/h4>\n\n\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v <span class=\"br0\">&#123;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">2<\/span>,<span class=\"nu0\">3<\/span>,<span class=\"nu0\">4<\/span>,<span class=\"nu0\">5<\/span>,<span class=\"nu0\">6<\/span>,<span class=\"nu0\">7<\/span>,<span class=\"nu0\">8<\/span>,<span class=\"nu0\">9<\/span>,<span class=\"nu0\">10<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span> <br \/>\n<span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">auto<\/span> i <span class=\"sy4\">:<\/span> v<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">cout<\/span><span class=\"sy1\">&lt;&lt;<\/span>i<span class=\"sy1\">&lt;&lt;<\/span>endl<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p>Range-based loop to \u015bwietna rzecz wprowadzona w C++11. Dzi\u0119ki temu nie musimy korzysta\u0107 z dodatkowych metod! J\u0119zyk zrobi w\u0142a\u015bciwie wszystko za nas! Zmienna i przechowuje aktualnie przetwarzany element kontenera, kt\u00f3ry wy\u015bwietlamy za pomoc\u0105 strumienia. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Spos\u00f3b III &#8211; iteratory<\/h4>\n\n\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> v <span class=\"br0\">&#123;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">2<\/span>,<span class=\"nu0\">3<\/span>,<span class=\"nu0\">4<\/span>,<span class=\"nu0\">5<\/span>,<span class=\"nu0\">6<\/span>,<span class=\"nu0\">7<\/span>,<span class=\"nu0\">8<\/span>,<span class=\"nu0\">9<\/span>,<span class=\"nu0\">10<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span>vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span><span class=\"sy4\">::<\/span><span class=\"me2\">iterator<\/span> iter <span class=\"sy1\">=<\/span> v.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>iter<span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span>v.<span class=\"me1\">end<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><span class=\"sy2\">++<\/span>iter<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">cout<\/span><span class=\"sy1\">&lt;&lt;<\/span><span class=\"sy2\">*<\/span>iter<span class=\"sy1\">&lt;&lt;<\/span>endl<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p>Zapis zdecydowanie najtrudniejszy i najd\u0142u\u017cszy. W tym wypadku korzystamy z iterator\u00f3w. Na pocz\u0105tku w ramach inicjacji p\u0119tli tworzymy iterator wskazuj\u0105cy na pierwszy element vectora. Warunkiem ko\u0144cz\u0105cym jest zr\u00f3wnanie iteratora iter z iteratorem wskazuj\u0105cym za ostatni element tablicy. Po ka\u017cdym przej\u015bciu zwi\u0119kszamy iterator o 1, co przek\u0142ada si\u0119 na to \u017ce wskazujemy tym samym na nast\u0119pny element. <\/p>\n\n\n\n<p>Aby wy\u015bwietli\u0107 element vectora wskazywany przez iterator, musimy wykona\u0107 operacj\u0119 &#8222;wy\u0142uskania&#8221;. To dlatego w linijce 3 widzisz t\u0105 gwiazdk\u0119 przy nazwie iteratora. Wy\u0142uskanie pozwala dobra\u0107 si\u0119 do oryginalnego vectora.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zadanie<\/h3>\n\n\n\n<p>Napisz program, kt\u00f3ry:<\/p>\n\n\n\n<ul><li>utworzy vector vec1<\/li><li>Doda do vec1 nast\u0119puje liczby: 3.5, 4.5, 2.25, 3.34<\/li><li>Utworzy vector vec2, kt\u00f3ry b\u0119dzie zawiera\u0142 na pocz\u0105tku te same warto\u015bci co vec1<\/li><li>Doda do vectora vec2 po dwa elementy 0 warto\u015bci 0 na pocz\u0105tku i na ko\u0144cu vectora. <\/li><li>Utworzy vector vec3, kt\u00f3ry b\u0119dzie zawiera\u0142 te same elementy co vec2. <\/li><li>Usunie z vectora vec3 element o indeksach: 1, 3, 4, 5, 6<\/li><li>Wy\u015bwietli zawarto\u015b\u0107 ka\u017cdego vectora za pomoc\u0105 trzech r\u00f3\u017cnych sposob\u00f3w<\/li><\/ul>\n\n\n\n<div class=\"cppCompiler\">\n<div class=\"cppPoweredBy\">\nPowered By <a target=\"_blank\" href=\"https:\/\/coliru.stacked-crooked.com\/\" rel=\"noopener noreferrer\">Coliru Online Compiler<\/a> and <a target=\"_blank\" href=\"https:\/\/ace.c9.io\/\" rel=\"noopener noreferrer\">Ace editor<\/a>\n<\/div>\n<div class=\"cppEditorParent\">\n<div class=\"cppEditor\" id=\"editor1\" style=\"width: 500px\">#include &lt;iostream&gt;\n#include &lt;vector&gt;\nusing std::vector;\nusing std::cout;\nusing std::endl;\nint main() {\n     return 0;\n}\n<\/div>\n\n<\/div>\n<pre class=\"EditorResult\" id=\"editor1Result\"><\/pre>\n<\/div>\n\n\n<span class=\"collapseomatic \" id=\"id69e09035d75c9\"  tabindex=\"0\" title=\"Poprawny wynik dzia\u0142ania programu\"    >Poprawny wynik dzia\u0142ania programu<\/span><div id=\"target-id69e09035d75c9\" class=\"collapseomatic_content \">\nvec1: 3.5 4.5  2.25  3.34<br \/>\nvec2: 0  0  3.5  4.5  2.25 3.34  0  0<br \/>\nvec3: 0  3.5  0<br \/>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Vector &#8211; zaawansowane<\/h2>\n\n\n\n<p>Na koniec om\u00f3wimy sobie dwie dodatkowe rzeczy, kt\u00f3rymi powiniene\u015b si\u0119 zaj\u0105\u0107 je\u015bli dobrze rozumiesz materia\u0142 z pierwszej cz\u0119\u015bci wpisu. Nauczymy si\u0119 m.in. \u0142atwo konstruowa\u0107 obiekty klas wewn\u0105trz vectora Poznamy tak\u017ce iteratory, kt\u00f3re przechodz\u0105 vector &#8222;w drug\u0105 stron\u0119&#8221;. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dodawanie obiekt\u00f3w klas do vectora<\/h3>\n\n\n\n<p>Tworz\u0105c bardziej zaawansowane projekty z pewno\u015bci\u0105 wiele razy spotkasz si\u0119 z potrzeb\u0105 dodania obiekt\u00f3w klas do vectora. Posiadaj\u0105c powy\u017csz\u0105 wiedz\u0119, m\u00f3g\u0142by\u015b to zrobi\u0107 nast\u0119puj\u0105co: <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw2\">class<\/span> Foo<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw2\">public<\/span><span class=\"sy4\">:<\/span><br \/>\n&nbsp; &nbsp; Foo<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> __x,<span class=\"kw4\">int<\/span> __y,<span class=\"kw4\">int<\/span> __z<span class=\"br0\">&#41;<\/span> <span class=\"sy4\">:<\/span> x<span class=\"br0\">&#40;<\/span>__x<span class=\"br0\">&#41;<\/span>,y<span class=\"br0\">&#40;<\/span>__y<span class=\"br0\">&#41;<\/span>,z<span class=\"br0\">&#40;<\/span>__z<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw2\">private<\/span><span class=\"sy4\">:<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> x,y,z<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"kw4\">int<\/span> main<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; vector <span class=\"sy1\">&lt;<\/span>Foo<span class=\"sy1\">&gt;<\/span> vec<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; Foo ob1<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">2<\/span>,<span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; Foo ob2<span class=\"br0\">&#40;<\/span><span class=\"nu0\">3<\/span>,<span class=\"nu0\">4<\/span>,<span class=\"nu0\">5<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; vec.<span class=\"me1\">push_back<\/span><span class=\"br0\">&#40;<\/span>ob1<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; vec.<span class=\"me1\">push_back<\/span><span class=\"br0\">&#40;<\/span>ob2<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; vec.<span class=\"me1\">push_back<\/span><span class=\"br0\">&#40;<\/span>Foo<span class=\"br0\">&#40;<\/span><span class=\"nu0\">6<\/span>,<span class=\"nu0\">7<\/span>,<span class=\"nu0\">8<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"example_code\">Powy\u017csza metoda dzia\u0142a, ale nie jest doskona\u0142a. Dlaczego? Poniewa\u017c tworzymy obiekty tymczasowe. S\u0142u\u017c\u0105 one jedynie do kreacji obiektu i jego &#8222;chwilowego&#8221; przytrzymania zanim trafi do vectora. Dzieje si\u0119 tak przy ka\u017cdym <em>push_back()<\/em>. Nawet tym znajduj\u0105cym si\u0119 w ostatniej linijce. Tam obiekt tymczasowy tworzony jest jedynie mniej jawnie. <\/p>\n\n\n\n<p>Istnieje rozwi\u0105zanie tego problemu. Powy\u017cszy kod mo\u017cna zapisa\u0107 o wiele pro\u015bciej i wydajniej w nast\u0119puj\u0105cy spos\u00f3b. <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"kw2\">class<\/span> Foo<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw2\">public<\/span><span class=\"sy4\">:<\/span><br \/>\n&nbsp; &nbsp; Foo<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> __x,<span class=\"kw4\">int<\/span> __y,<span class=\"kw4\">int<\/span> __z<span class=\"br0\">&#41;<\/span> <span class=\"sy4\">:<\/span> x<span class=\"br0\">&#40;<\/span>__x<span class=\"br0\">&#41;<\/span>,y<span class=\"br0\">&#40;<\/span>__y<span class=\"br0\">&#41;<\/span>,z<span class=\"br0\">&#40;<\/span>__z<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw2\">private<\/span><span class=\"sy4\">:<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> x,y,z<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"kw4\">int<\/span> main<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; vector <span class=\"sy1\">&lt;<\/span>Foo<span class=\"sy1\">&gt;<\/span> vec<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; vec.<span class=\"me1\">emplace_back<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">2<\/span>,<span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; vec.<span class=\"me1\">emplace_back<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">3<\/span>,<span class=\"nu0\">4<\/span>,<span class=\"nu0\">5<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; vec.<span class=\"me1\">emplace_back<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">6<\/span>,<span class=\"nu0\">7<\/span>,<span class=\"nu0\">8<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"example_code\">Prawda, \u017ce teraz jest o wiele lepiej i przyjemniej? Wykorzystali\u015bmy metod\u0119 <em>emplace_back<\/em>. Dzia\u0142a ona w ten sam spos\u00f3b co push_back Jako argument tej funkcji podajemy dok\u0142adnie to samo, co chcieliby\u015bmy poda\u0107 w konstruktorze obiektu klasy kt\u00f3ry chcemy stworzy\u0107. Obiekt tworzony jest &#8222;bezpo\u015brednio&#8221; w vectorze, dzi\u0119ki czemu oszcz\u0119dzamy czas i pami\u0119\u0107. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Iteratory wsteczne<\/h3>\n\n\n\n<p>Iteratory wsteczne s\u0105 bardzo fajn\u0105 zabawk\u0105. Pozwalaj\u0105 przejrze\u0107 tablic\u0119 &#8222;od ty\u0142u&#8221;, co czasem jest przydatne. <\/p>\n\n\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/><\/div><\/td><td><div class=\"cpp codecolorer\">vector <span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span> vec <span class=\"br0\">&#123;<\/span><span class=\"nu0\">1<\/span>,<span class=\"nu0\">2<\/span>,<span class=\"nu0\">3<\/span>,<span class=\"nu0\">4<\/span>,<span class=\"nu0\">5<\/span>,<span class=\"nu0\">6<\/span>,<span class=\"nu0\">7<\/span>,<span class=\"nu0\">8<\/span>,<span class=\"nu0\">9<\/span>,<span class=\"nu0\">10<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy4\">;<\/span> <br \/>\n<span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span>vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span><span class=\"sy4\">::<\/span><span class=\"me2\">iterator<\/span> iter <span class=\"sy1\">=<\/span> vec.<span class=\"me1\">begin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>iter<span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span>vec.<span class=\"me1\">end<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>iter<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">cout<\/span><span class=\"sy1\">&lt;&lt;<\/span><span class=\"sy2\">*<\/span>iter<span class=\"sy1\">&lt;&lt;<\/span>endl<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw3\">cout<\/span><span class=\"sy1\">&lt;&lt;<\/span>endl<span class=\"sy4\">;<\/span><br \/>\n<span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span>vector<span class=\"sy1\">&lt;<\/span><span class=\"kw4\">int<\/span><span class=\"sy1\">&gt;<\/span><span class=\"sy4\">::<\/span><span class=\"me2\">reverse_iterator<\/span> iter <span class=\"sy1\">=<\/span> vec.<span class=\"me1\">rbegin<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>iter<span class=\"sy3\">!<\/span><span class=\"sy1\">=<\/span>vec.<span class=\"me1\">rend<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>iter<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">cout<\/span><span class=\"sy1\">&lt;&lt;<\/span><span class=\"sy2\">*<\/span>iter<span class=\"sy1\">&lt;&lt;<\/span>endl<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"example_code\">Powy\u017cszy listing wy\u015bwietla zawarto\u015b\u0107 vectora vec najpierw od przodu, a nast\u0119pnie od ty\u0142u. Na pewno zauwa\u017cy\u0142e\u015b, \u017ce iteratory wsteczne praktycznie niczym nie r\u00f3\u017cni\u0105 si\u0119 od zwyk\u0142ych. Ot &#8211; zwyk\u0142e nazewnictwo. Zamiast <em>iterator<\/em> jest <em>reverse_iterator<\/em>, zamiast <em>begin()<\/em> jest <em>rbegin<\/em>(), a zamiast <em>end() <\/em>&#8211; <em>rend()<\/em>. Poza tym nic skomplikowanego, prawda?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zadanie 2<\/h3>\n\n\n\n<p>Napisz program, kt\u00f3ry:<\/p>\n\n\n\n<ul><li>deklaruje klas\u0119 Point. Jej atrybutami prywatnymi powinny by\u0107 zmienne ca\u0142kowitoliczbowe x, y<ul><li>Klasa Point powinna implementowa\u0107 jeden konstruktor, kt\u00f3ry jako argumenty przyjmuje dwie zmienne typu int. Prywatne atrybuty powinny zosta\u0107 zainicjowane za pomoc\u0105  listy inicjalizacyjnej<\/li><\/ul><\/li><li>Tworzy vector przechowuj\u0105cy obiekty klasy Point<\/li><li>Wype\u0142nia vector punktami (3,0), (4,5), (2,1), (9,3), (3,2)<\/li><li>Wy\u015bwietla zawarto\u015b\u0107 vectora w obydwu kierunkach<\/li><\/ul>\n\n\n\n<div class=\"cppCompiler\">\n<div class=\"cppPoweredBy\">\nPowered By <a target=\"_blank\" href=\"https:\/\/coliru.stacked-crooked.com\/\" rel=\"noopener noreferrer\">Coliru Online Compiler<\/a> and <a target=\"_blank\" href=\"https:\/\/ace.c9.io\/\" rel=\"noopener noreferrer\">Ace editor<\/a>\n<\/div>\n<div class=\"cppEditorParent\">\n<div class=\"cppEditor\" id=\"editor2\" style=\"width: 500px\">#include &lt;iostream&gt;\n#include &lt;vector&gt;\nusing std::vector;\nusing std::cout;\nusing std::endl;\nint main() {\n     return 0;\n}\n<\/div>\n\n<\/div>\n<pre class=\"EditorResult\" id=\"editor2Result\"><\/pre>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Podoba\u0142o ci si\u0119? Nauczy\u0142e\u015b si\u0119 czego\u015b?<\/h2>\n\n\n\n<p>Zako\u0144czyli\u015bmy omawianie podstawowych cech kontenera vector. U\u017cywaj go najcz\u0119\u015bciej jak tylko si\u0119 da. Nie m\u0119cz si\u0119 ze zwyk\u0142ymi tablicami [], w kt\u00f3rych musisz dba\u0107 o stanowczo zbyt wiele rzeczy. Naprawd\u0119 szkoda na to czasu i nerw\u00f3w \ud83d\ude42 Mam nadziej\u0119, \u017ce wpis ci si\u0119 podoba\u0142 \ud83d\ude42 <\/p>\n\n\n\n<p>Je\u015bli jeste\u015b nowym czytelnikiem, nie zapomnij o klikni\u0119ciu tego &#8222;dzwoneczka&#8221; po lewej stronie. Dzi\u0119ki temu dostaniesz powiadomienie o nowym wpisie :). Nie zapomnij tak\u017ce o polubieniu mojego fanpage&#8217;a. <\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">4<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span> W swoich programach z pewno\u015bci\u0105 przechowujesz r\u00f3\u017cne dane. Wykonujesz na nich r\u00f3\u017cne operacje i przekszta\u0142cenia. Pozna\u0142e\u015b do tej pory co\u015b takiego jak &#8222;tablica&#8221; (np.: int array[n]), kt\u00f3ra s\u0142u\u017cy do przechowywania &#8230;<\/p>\n","protected":false},"author":1,"featured_media":463,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[31],"tags":[64],"_links":{"self":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1490"}],"collection":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1490"}],"version-history":[{"count":58,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1490\/revisions"}],"predecessor-version":[{"id":1556,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1490\/revisions\/1556"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media\/463"}],"wp:attachment":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1490"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}