Advertisement
adwas33

Pierwszy - podstawy i iteratory

May 8th, 2021
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <vector>
  4. #include <random>
  5. #include <algorithm>
  6.  
  7.  
  8. using namespace std;
  9. void wypisz(vector<int> &wektor)
  10. {
  11. for(auto &kazdy:wektor)
  12. {
  13. cout<<kazdy<<" ";
  14. }
  15. cout<<endl;
  16. }
  17. void wypisz(vector<short> &wektor)
  18. {
  19. for(auto &kazdy:wektor)
  20. {
  21. cout<<kazdy<<" ";
  22. }
  23. cout<<endl;
  24. }
  25.  
  26. int main() {
  27. vector<int> pusta_tablica; // nie ma nic nie [0]
  28. // 0 1 2 ... 9 indeksy
  29. vector<int> tablica(10); // 0 0 0 0 .. 0 wartosci
  30. vector<int> tablica_zainicjalizowana(10,5);
  31. cout<<"Wypisuje pusta tablice "<<endl;
  32. /// auto zastępuje dowolny typ
  33.  
  34. for(int kazdy:pusta_tablica) // inaczej można tą pętle zapisać
  35. {
  36. cout<<kazdy<<" ";
  37. }
  38. // for(int i =0;i<pusta_tablica.size();i++) //<- wersja konwencjonalna
  39. // {
  40. // cout<<pusta_tablica[i]<<" ";
  41. // }
  42. // for(vector<int>::iterator poczatek=pusta_tablica.begin();poczatek!=pusta_tablica.end();poczatek++)// <- wersja alternatywna z iteratorem
  43. // {
  44. // cout<<*poczatek<<" ";
  45. // }
  46.  
  47. cout<<endl;
  48. cout<<"Wypisuje tablice w domysle zainicjalizowana zerami "<<endl;
  49. for(auto kazdy:tablica)
  50. {
  51. cout<<kazdy<<" ";
  52. }
  53. cout<<endl;
  54. cout<<"Wypisuje tablice w domysle zainicjalizowana 5-tkami "<<endl;
  55. for(auto kazdy:tablica_zainicjalizowana)
  56. {
  57. cout<<kazdy<<" ";
  58. }
  59. cout<<endl;
  60. cout<<"Dodaje i wypisuje do (kopi) kazdego elementu liczbe 2 "<<endl;
  61. for(auto kazdy:tablica)
  62. {
  63. kazdy+=2;
  64. cout<<kazdy<<" ";
  65. }
  66. cout<<endl;
  67. cout<<"Mimo przejscia po wszystkich elementach tablicy tablica pierwotna zostala bez zmian "<<endl;
  68. for(auto kazdy:tablica)
  69. {
  70.  
  71. cout<<kazdy<<" ";
  72. }
  73. cout<<endl;
  74. //int *ades=&tablica_zainicjalizowana[0];
  75.  
  76. for(auto &kazdy:tablica) // użycie referencji przed typem
  77. {
  78. kazdy+=99;
  79. }
  80. for(auto kazdy:tablica)
  81. {
  82.  
  83. cout<<kazdy<<" ";
  84. }
  85. /*
  86. * for( typ nazwa:nazwa_tablicy) // dla każdego elementu
  87. *
  88. * {
  89. * }
  90. */
  91. cout<<endl;
  92. int i=0;
  93. pusta_tablica=tablica_zainicjalizowana;// operator = działa tak samo jak dla zwykłych typów ( pusta_tablica będzie miała rozmiar i wartosci takie same jak tablica zainicjalizowana)
  94. /*
  95. * Przewagi wektorów nad dynamicznymi tablicami
  96. * ->Do wektorów można łatwo dodawać nowe elementy
  97. * ->W wektorach można zmieniać długość wektora w dość prosty sposób
  98. * ->Wektory posiadają metodę która zwraca ilość elementów w tej tablicy
  99. * ->Poprzez posiadanie iteratora(coś ala wskaźnik) można w łatwy sposób iterować oraz po danych elementach NIE znając długości tej tablicy
  100. * ->Można skorzystać z gotowych rozwiązań do 1) sortowania 2) zamiany 3) wstawiania elementów w środek i inne
  101. */
  102. cout<<"Pokazuje ze operator przypisania wektora do wektora dziala "<<endl;
  103. for(int i =0;i<pusta_tablica.size();i++)
  104. {
  105.  
  106. cout<<pusta_tablica[i]<<" ";
  107. }
  108. cout<<endl;
  109. pusta_tablica.clear(); // czyści nam tablicę do pierwotnego stanu // nic nie będzie w puustej tablicy
  110. cout<<"A tutaj ze metoda clear() usuwa nam wszystkie elementy w wektorze "<<endl;
  111. wypisz(pusta_tablica);
  112.  
  113. for(int i=0;i<20;i++)
  114. {
  115. pusta_tablica.push_back(i+1);// dodajemy nowy element poprzez metodę push_back(wartosc)
  116.  
  117. }
  118. for(int kazdy:pusta_tablica)
  119. {
  120. cout<<kazdy<<" ";
  121. }
  122. cout<<endl;
  123. for(int i=0;i<5;i++)
  124. {
  125. pusta_tablica.pop_back();
  126. }
  127. for(int kazdy:pusta_tablica)
  128. {
  129. cout<<kazdy<<" ";
  130. }
  131. cout<<endl;
  132. pusta_tablica.erase(pusta_tablica.begin(),pusta_tablica.begin()+5);
  133.  
  134. for(int kazdy:pusta_tablica)
  135. {
  136. cout<<kazdy<<" ";
  137. }
  138. cout<<endl;
  139. // pusta_tablica.clear();
  140. // wypisz(pusta_tablica);
  141.  
  142.  
  143. pusta_tablica.erase(pusta_tablica.end()-5,pusta_tablica.end());
  144.  
  145. for(int kazdy:pusta_tablica)
  146. {
  147. cout<<kazdy<<" ";
  148. }
  149. cout<<endl;
  150. cout<<endl;
  151. uniform_int_distribution<short> funkcja (-100,300);
  152. default_random_engine silnik;
  153. vector<short> nowe;
  154.  
  155. for(int i=0;i<300;i++) //300 lub więcej nie spowoduje błędów
  156. {
  157. short cos=funkcja(silnik);
  158. nowe.push_back(cos);
  159. cout<<nowe[i]<<" ";
  160. }
  161. cout<<endl;
  162. sort(nowe.begin(),nowe.end());
  163. wypisz(nowe);
  164. vector<short>::iterator iterator=nowe.begin();
  165. for(auto kazdy:nowe)
  166. {
  167. if(kazdy<135)
  168. {
  169. iterator++;
  170. }
  171. }
  172. cout<<endl<<endl;
  173.  
  174. nowe.erase(nowe.begin(),iterator);
  175.  
  176. wypisz(nowe);
  177.  
  178. for(int i=0;i<50;i++)
  179. {
  180. nowe.erase(nowe.rbegin().base()-1);
  181. }
  182. cout<<endl;
  183. wypisz(nowe);
  184. sort(nowe.begin(),nowe.end(),greater<short>());
  185. wypisz(nowe);
  186. vector<short>::reverse_iterator tylny= nowe.rbegin();
  187. vector<short>::reverse_iterator przedni= nowe.rend();
  188. cout<<"Wypisuje wyluskanie reverse itteratora wektora nowe wskazujacego na rbegin(czyli ostatni element) "<<*tylny<<endl;
  189. cout<<"Wypisuje wyluskanie reverse itteratora wektora nowe wskazujacego na rend(czyli pierwszy element) "<<*(przedni-1)<<endl;
  190. // nie działa normalne wypisanie gdyż reverse iterator ma ideks o 1 mniejszy niż jego odpowiednik
  191. // dlatego teraz pokażę jeden z błędów jakie może powodować iterowanie po iteratorach
  192. for(auto iterator= nowe.begin();iterator!=nowe.end();iterator++)
  193. {
  194. cout<<*iterator<<" ";
  195. }
  196.  
  197. // short * wskaznik=& *nowe.begin();
  198.  
  199. cout<<endl<<endl;
  200. for(auto iterator= nowe.end()-1;iterator!=nowe.begin();iterator--)
  201. {
  202. cout<<*iterator<<" ";
  203. }
  204. // by uniknąć błędu wyjścia i próby wyłuskania elementu nie znajdującego się we wektorze zastosujemy reverse iterator
  205. cout<<endl<<endl;
  206. for(auto iterator= nowe.rend();iterator.base()!=nowe.begin();iterator++)
  207. {
  208. cout<<*iterator<<" ";
  209. }
  210. cout<<endl<<endl;
  211. // możemy łatwo sprawdzić rozmiar / dystans między 2-ma iteratorami operującymi na tym samym wektorze
  212. int dystans_w_nowe=distance(nowe.begin(),nowe.end());// da taki sam wynik jak .size()
  213. if(dystans_w_nowe==nowe.size())
  214. {
  215. cout<<"Dystans jest taki sam jak wartosc zwracana z metody .size()"<<endl;
  216. }
  217.  
  218. /*
  219. * By się pozbyć wielu elementów z przodu albo z tułu , chcemy nie brać pod np kilku wartości z przodu lub z tyłu
  220. * możemy używając funkcji advance ( iter przesuwany_iterator,int o_ile_przesunac_i_gdzie)
  221. * advance(
  222. */
  223. auto przedni_iterator=nowe.begin(),tylni_iterator=nowe.end();
  224. //np chcemy wziąść 20 okolo elementow ze środka
  225.  
  226. advance(przedni_iterator,distance(nowe.begin(),nowe.end())/2 -10);
  227. advance(tylni_iterator,-distance(nowe.begin(),nowe.end())/2 +10) ;
  228.  
  229. cout<<endl<<distance(przedni_iterator,tylni_iterator)<<endl;
  230.  
  231. for(int i=0;przedni_iterator!=tylni_iterator;przedni_iterator++)
  232. {
  233. i++;
  234. cout<<*przedni_iterator<<" "<<i<<endl;
  235. }
  236. cout<<endl<<nowe.size()<<endl;
  237. nowe.erase(nowe.begin()+10,nowe.begin()+40);
  238. for(auto kazdy:nowe)
  239. {
  240. cout<<kazdy<<" ";
  241. }
  242. cout<<endl<<nowe.size();
  243. // vector<int>::iterator nowy=pusta_tablica.begin();
  244. // nowy+=10;
  245. return 0;
  246. }
  247.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement