Advertisement
adwas33

Untitled

May 8th, 2021
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <random>
  6.  
  7. using namespace std;
  8. ostream & operator <<(ostream &os,pair<double,double> &para)
  9. {
  10. os<<para.first<<" "<<para.second;
  11. return os;
  12. }
  13. static int stopien_abstrakcji=0;
  14. template<class T,class Z>
  15. ostream & operator<< (ostream &os,pair<T,Z> para);
  16. template<class T>
  17. ostream & operator <<(ostream &os,vector<T> &vektor);
  18. template<class T>
  19. vector<T> & operator += (vector<T> &poczatkowy,vector<T> &dodawany);
  20. template<class T>
  21. vector<T> & operator += (vector<T> &poczatkowy,int &dodawany);
  22. template<class T,class Z>
  23. vector<T> & operator += (vector<T> &pocz,vector<Z> dod)
  24. {
  25. int i=0;
  26. for(auto &kazdy:pocz)
  27. {
  28. for(auto &dodawany:dod)
  29. {
  30. kazdy+=dodawany;
  31. }
  32.  
  33.  
  34.  
  35.  
  36. }
  37. return pocz;
  38. }
  39.  
  40.  
  41. int main() {
  42.  
  43. /*
  44. * pair<class T,class Z>
  45. */
  46.  
  47. /*
  48. * W tej części zajmiemy się tablicami wielowymiarowymi oraz obiektami typu pair
  49. * Drugą część "Wykładu" poświęcimy na użytecznne aspekty programowania generycznego
  50. */
  51. // pari<typ1,typ2> nazwa_zmiennej;
  52. pair<int,int> zespolona;
  53. zespolona.first=10;
  54. zespolona.second=30;
  55. pair<double,double> zespolona_zmiennoprzecinkowa(13.5,11);
  56. cout<<"Pierwsza zespolona calkowita to : Re "<<zespolona.first<<" Im "<<zespolona.second<<endl;
  57. cout<<"Druga zespolona o rzeczywistych parametrach to : Re "
  58. <<zespolona_zmiennoprzecinkowa.first<<" Im "<<zespolona_zmiennoprzecinkowa.second<<endl;
  59. pair<pair<double,double>,pair<double,double>> odcinek_na_plaszczyznie_zespolonej;
  60. odcinek_na_plaszczyznie_zespolonej.first=zespolona_zmiennoprzecinkowa;
  61. odcinek_na_plaszczyznie_zespolonej.second=zespolona;
  62. pair<pair<double,double>,pair<double,double>> odcinek_na_plaszczyznie_zespolonej_zainicjalizowany({11,12},{77,66});
  63. /*
  64. * Aby inicjalizować składniki typu pair za pomocą listy inicjalizacyjnej trzeba używać nawiasów klamrowych{}
  65. * Mogą być one zainicjalizowane również za pomocą utworzonych wcześniej obiektów
  66. */
  67. cout<<zespolona_zmiennoprzecinkowa<<endl<<odcinek_na_plaszczyznie_zespolonej_zainicjalizowany.first
  68. <<" "<<odcinek_na_plaszczyznie_zespolonej_zainicjalizowany.second<<endl;
  69.  
  70. /*
  71. * pair<typ1,typ2> nazwa;pair<typ1,typ2> nazwa(konstuktor_typu_1,konstruktor_typu_2);
  72. * gdzie typ1 oraz typ2 mogą być to dowolne typy ( np pair<string,string> pair<int,int*> itp....)
  73. *
  74. */
  75. swap(odcinek_na_plaszczyznie_zespolonej_zainicjalizowany.first,zespolona_zmiennoprzecinkowa);
  76. //Ta funkcja zamienia nam te 2 obiekty w danej parze , strukturze jedyny wymóg jest taki by oba miały te same typy
  77. //Np pair<double,double> musi być zamieniona z pair<double,double> etc ....
  78. /*
  79. * Możemy tak samo zamieniać obiekty metodą z pary
  80. */
  81. pair<int,string> id_stringa(1,"Testowy string");
  82. pair<int,string> id_stringa_drugiego(2,"Testowy string numer 2");
  83. cout<<id_stringa.first<<" "<<id_stringa.second<<endl;
  84. cout<<id_stringa_drugiego.first<<" "<<id_stringa_drugiego.second<<endl;
  85.  
  86. id_stringa.swap(id_stringa_drugiego);
  87. cout<<id_stringa.first<<" "<<id_stringa.second<<endl;
  88. cout<<id_stringa_drugiego.first<<" "<<id_stringa_drugiego.second<<endl;
  89.  
  90.  
  91. /*
  92. * Drobna powtórka z wektorów
  93. */
  94. /*
  95. * Tutaj mamy pojedynczą tablicę zainicjalizowaną 10-tkami i ma długość 5
  96. */
  97.  
  98. vector<int> pojedyncza_tablica(5,10);
  99. //Można też zrobić
  100. //vector<vector<int>> tablica_dwuwymiarowa(5,pojedyncza_tablica);
  101. vector<vector<int>> tablica_dwuwymiarowa(5,{10,10});
  102. for(auto &kazdy:tablica_dwuwymiarowa)
  103. {
  104. for(int i =0;i<10;i++)
  105. {
  106. kazdy.push_back(i);
  107.  
  108. }
  109. }
  110. cout<<tablica_dwuwymiarowa;
  111. for(int i=0;i<3;i++)
  112. {
  113. cout<<"Ide poziomo po indeksie [0]["<<i<<"] "<<tablica_dwuwymiarowa[0][i]<<endl;
  114.  
  115. }
  116. for(int i=0;i<3;i++)
  117. {
  118. cout<<"Ide pionowo po indeksie ["<<i<<"][0] "<<tablica_dwuwymiarowa[i][0]<<endl;
  119. }
  120.  
  121. vector<vector<vector<int>>> tablica_trzy_wymiarowa(3,{{10,11,12},{1,2,3},{4,5,6}});
  122. for(int i=0;i<3;i++)
  123. {
  124. cout<<"Ide poziomo (Wzdluz X) po indeksie [0][0]["<<i<<"] "<<tablica_trzy_wymiarowa[0][0][i]<<endl;
  125.  
  126. }
  127. for(int i=0;i<3;i++)
  128. {
  129. cout<<"Ide pionowo (Wzdluz Y) po indeksie [0]["<<i<<"][0] "<<tablica_trzy_wymiarowa[0][i][0]<<endl;
  130. }
  131. for(int i=0;i<3;i++)
  132. {
  133. cout<<"Ide poziomo (Wzdluz Z) po indeksie ["<<i<<"][0][0] "<<tablica_trzy_wymiarowa[i][0][0]<<endl;
  134. }
  135.  
  136.  
  137. cout<<tablica_trzy_wymiarowa<<endl<<"Dodaje nowy element to 3 wymiarowej tablicy"<<endl;
  138. tablica_trzy_wymiarowa.push_back({{33,33,33},{44,44,44},{55,55,55}});
  139.  
  140. cout<<tablica_trzy_wymiarowa;
  141. int licznik=0;
  142. for(auto &trzeci:tablica_trzy_wymiarowa)
  143. {
  144. for(auto &drugi:trzeci)
  145. {
  146. for(int i =0;i<20;i++)
  147. {
  148. drugi.push_back(licznik);
  149. licznik++;
  150. }
  151.  
  152. }
  153. }
  154.  
  155. cout<<tablica_trzy_wymiarowa;
  156. for( auto &trzeci:tablica_trzy_wymiarowa)
  157. {
  158. trzeci.erase(trzeci.end()-1);
  159. }
  160. cout<<tablica_trzy_wymiarowa;
  161. tablica_trzy_wymiarowa.pop_back();
  162. cout<<tablica_trzy_wymiarowa;
  163.  
  164.  
  165.  
  166.  
  167. /*
  168. * Wyrażenie lambda [lista rzeczy którycch możemy używać] (ampersant pracujemy na referencji bez niego pracujemy na kopiach)]
  169. * (lista parametrów przekazywanych do funkcji) {ciało funkcji} (parametry z którymi chcemy by ona działała)
  170. *
  171. * inaczej można lambde zapisać []()->typ_zwracany{}; lub []()->typ_zwracany{}(); <- wywołanie tej funkcji
  172. *
  173. */
  174.  
  175.  
  176.  
  177. auto funkcja= [](vector<vector<vector<int>>> &wymiarowy){
  178. for(auto &trzeci:wymiarowy)
  179. {
  180.  
  181. for(auto &drugi:trzeci)
  182. {
  183.  
  184. for(auto &pierwszy:drugi)
  185. {
  186. cout<<pierwszy<<" ";
  187. }
  188. cout<<endl;
  189. }
  190. cout<<endl;
  191. }
  192.  
  193. };
  194.  
  195. cout<<" cos wypisuje "<<endl;
  196. funkcja(tablica_trzy_wymiarowa);
  197. auto wyrazenie_logiczne_lambda= [](int a,int b)->bool{return a>b;};
  198.  
  199. sort(tablica_trzy_wymiarowa[0][0].begin(),tablica_trzy_wymiarowa[0][0].end(),[](int a,int b)->bool {
  200. return a<b? true:false;
  201. });
  202. // pierwszy> lub < 2alg
  203.  
  204. cout<<"Sortuje pierwsza i druga tabele malejaco "<<endl;
  205.  
  206. sort(tablica_trzy_wymiarowa[0][1].begin(),tablica_trzy_wymiarowa[0][1].end(),wyrazenie_logiczne_lambda);
  207. // sort(tablica_trzy_wymiarowa[0][2].begin(),tablica_trzy_wymiarowa[0][2].end(),wyrazenie_logiczne_lambda);
  208. funkcja(tablica_trzy_wymiarowa);
  209.  
  210. /*
  211. * Jak widzimy alokator dla wektorów działa dość dobrze jednak jeśli potrzebujemy zrobić bardziej specyficzne
  212. * zarządzanie pamięcią , przyjmować typy totalnie z kosmosu albo np dodatkowo monitorować używanie pamięci
  213. * (np zapis do pliku automatycznie w trakcie modyfikacji czegoś to możemy napisać własny alokator pamięci
  214. *
  215. */
  216. //vector<int()>wskazniki_na_funkcje;
  217.  
  218. vector<string> tablica_napisow(3,"abc");
  219. vector<string> tablica_napisow_cba(4,"cba");
  220.  
  221. tablica_napisow+=tablica_napisow_cba;
  222. //nasz nowozdefiniowany operator += dla typów generycznych działa
  223. cout<<tablica_napisow;
  224. vector<vector<int>> liczby(10,{1,2,3,4,5});
  225. for(int i=0;i<10;i++)
  226. {
  227. liczby[i]+=i;
  228. }
  229. cout<<liczby;
  230. tablica_napisow+=liczby[0];
  231. cout<<tablica_napisow;
  232. // // tablica_napisow+=liczby; nie możemy tego zrobić ponieważ typ vektora nr 1 i nr 2 są różne
  233.  
  234.  
  235. // vector<vector<int>> tablica_2_wym(10);
  236. //for(auto &kazdy:tablica_2_wym)
  237. //{
  238. // for(int i =0;i<100;i++)
  239. // {
  240. // kazdy.push_back(i%10);
  241. // }
  242. //}
  243. //for(auto &kazdy:tablica_2_wym)
  244. //{
  245. // sort(kazdy.begin(),kazdy.end());
  246. //}
  247.  
  248.  
  249.  
  250.  
  251. /*
  252. * Nie polecam wam aż tak komplikować jednak ten przykład ma na celu pokazać że przez programowanie generyczne możemy wybrnąć
  253. * w dość łatwy sposób z wypisywaniem i innego typu operacjami na typach generycznych
  254. */
  255.  
  256. vector<pair<vector<int>,vector<vector<int>>>> vektor_par_od_vektoraIntowego_i_vektora_od_wektora_intowego(1);
  257. for(auto &kazdy:vektor_par_od_vektoraIntowego_i_vektora_od_wektora_intowego)
  258. {
  259. for(int i =0;i<11;i++)
  260. {
  261. kazdy.first.push_back(i);
  262. }
  263. for(int i =0;i<5;i++)
  264. {
  265. vector<int> podrobka;
  266. podrobka.push_back(-300);
  267. for(int j=0;j<7;j++)
  268. {
  269. podrobka.push_back(j);
  270. }
  271. for(int j=0;j<6;j++)
  272. {
  273. kazdy.second.push_back(podrobka);
  274. }
  275. }
  276.  
  277.  
  278. }
  279. cout<<vektor_par_od_vektoraIntowego_i_vektora_od_wektora_intowego<<endl;
  280. return 0;
  281.  
  282. }
  283. template<class T>
  284. ostream & operator <<(ostream &os,vector<T> &vektor)
  285. {
  286. stopien_abstrakcji++;
  287. if(stopien_abstrakcji!=2&&stopien_abstrakcji!=3)
  288. os<<" ";
  289.  
  290. for(auto kazdy:vektor) {
  291. os << kazdy << " ";
  292. }
  293. os<<endl;
  294. stopien_abstrakcji--;
  295. return os;
  296. }
  297. template<class T,class Z>
  298. ostream & operator<< (ostream &os,pair<T,Z> para){
  299. os<<para.first<<endl<<para.second<<endl;
  300. return os;
  301. }
  302. template<class T>
  303. vector<T> & operator += (vector<T> &poczatkowy,vector<T> &dodawany)
  304. {
  305. for(auto &kazdy_z_dodawanego:dodawany)
  306. {
  307. poczatkowy.push_back(kazdy_z_dodawanego);
  308. }
  309. return poczatkowy;
  310. }
  311. template<class T>
  312. vector<T> & operator += (vector<T> &poczatkowy,int &dodawanyint)
  313. {
  314. for(auto &kazdy:poczatkowy)
  315. {
  316. kazdy+=dodawanyint;
  317. }
  318. return poczatkowy;
  319. }
  320.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement