Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <initializer_list>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <functional>
  6. #include <stdexcept>
  7. #include <list>
  8.  
  9. template<typename TipE1, template<typename...>class Kontejner=std::vector>
  10. class Tok
  11. {
  12. Kontejner<TipE1>kolekcija;
  13. public:
  14. template<typename TipE12, template<typename...>class Kontejner2>
  15. friend class Tok;
  16. template<typename IterTip>
  17. Tok(IterTip pocetak, const IterTip iza_kraja)
  18. {
  19. auto ito=std::begin(kolekcija);
  20. while(pocetak!=iza_kraja)
  21. {
  22. ito=kolekcija.insert(ito, *pocetak);
  23. pocetak++;
  24. }
  25. std::reverse(std::begin(kolekcija), std::end(kolekcija));
  26. }
  27. template<typename IterabilniKontejner>
  28. Tok(const IterabilniKontejner &kontejner)
  29. {
  30. auto ito1=std::begin(kolekcija);
  31. auto ito2=std::begin(kontejner);
  32. while(ito2!=std::end(kontejner))
  33. {
  34. ito1=kolekcija.insert(ito1, *ito2);
  35. ito2++;
  36. }
  37. std::reverse(std::begin(kolekcija), std::end(kolekcija));
  38. }
  39. Tok(std::initializer_list<TipE1>lista)
  40. {
  41. auto ito1=std::begin(kolekcija);
  42. auto ito2=std::begin(lista);
  43. while(ito2!=std::end(lista))
  44. {
  45. ito1=kolekcija.insert(ito1, *ito2);
  46. ito2++;
  47. }
  48. std::reverse(std::begin(kolekcija), std::end(kolekcija));
  49. }
  50. static Tok<TipE1, Kontejner>Opseg(TipE1 poc, TipE1 kraj, TipE1 korak=1)
  51. {
  52. Tok povratni{};
  53. auto ito=std::begin(povratni.kolekcija);
  54. for(int i=poc; i<=kraj; i+=korak)
  55. {
  56. ito=povratni.kolekcija.insert(ito, poc);
  57. }
  58. std::reverse(std::begin(povratni.kolekcija), std::end(povratni.kolekcija));
  59. return povratni;
  60. }
  61. unsigned int Velicina()const
  62. {
  63. unsigned int povratni=0;
  64. auto ito=std::begin(kolekcija);
  65. while(ito!=std::end(kolekcija))
  66. {
  67. povratni++;
  68. ito++;
  69. }
  70. return povratni;
  71. }
  72. bool Prazan()const
  73. {
  74. return std::begin(kolekcija)==std::end(kolekcija);
  75. }
  76. Tok<TipE1, Kontejner>Limitiraj(unsigned int n)const
  77. {
  78. if(n==Velicina())
  79. {
  80. return *this;
  81. }
  82. Tok povratni{};
  83. auto ito1=std::begin(kolekcija);
  84. auto ito2=std::begin(povratni.kolekcija);
  85. for(int i=0; i<n; i++)
  86. {
  87. ito2=povratni.kolekcija.insert(ito2, *ito1);
  88. ito1++;
  89. }
  90. std::reverse(std::begin(povratni.kolekcija), std::end(povratni.kolekcija));
  91. return povratni;
  92. }
  93. Tok<TipE1, Kontejner>Preskoci(unsigned int n)const
  94. {
  95. Tok povratni{};
  96. if(n>Velicina()) return povratni;
  97. auto ito1=std::begin(kolekcija);
  98. auto ito2=std::begin(povratni.kolekcija);
  99. for(int i=0; i<n; i++) ito1++;
  100. while(ito1!=std::end(kolekcija))
  101. {
  102. ito2=povratni.kolekcija.insert(ito2, *ito1);
  103. ito1++;
  104. }
  105. std::reverse(std::begin(povratni.kolekcija), std::end(povratni.kolekcija));
  106. return povratni;
  107. }
  108. Tok<TipE1, Kontejner>Obrnut()const
  109. {
  110. Tok povratni{};
  111. auto ito1=std::begin(kolekcija);
  112. auto ito2=std::begin(povratni.kolekcija);
  113. while(ito1!=std::end(kolekcija))
  114. {
  115. ito2=povratni.kolekcija.insert(ito2, *ito1);
  116. ito1++;
  117. }
  118. return povratni;
  119. }
  120. Tok<TipE1, Kontejner>Akcija(std::function<void(void)>akcija)const
  121. {
  122. Tok povratni{};
  123. auto ito1=std::begin(kolekcija);
  124. auto ito2=std::begin(povratni.kolekcija);
  125. while(ito1!=std::end(kolekcija))
  126. {
  127. ito2=povratni.kolekcija.insert(ito2, *ito1);
  128. ito1++;
  129. }
  130. akcija();
  131. std::reverse(std::begin(povratni.kolekcija), std::end(povratni.kolekcija));
  132. return povratni;
  133. }
  134. void ZaSvaki(std::function<void(TipE1)> akcija)const
  135. {
  136. std::for_each(std::begin(kolekcija), std::end(kolekcija), akcija);
  137. }
  138. Tok<TipE1, Kontejner>Filtriraj(std::function<bool(TipE1)>predikat)const
  139. {
  140. Tok povratni{};
  141. auto ito1=std::begin(povratni.kolekcija);
  142. auto ito2=std::begin(kolekcija);
  143. while(ito2!=std::end(kolekcija))
  144. {
  145. if(predikat(*ito2))
  146. {
  147. ito1=povratni.kolekcija.insert(ito1, *ito2);
  148. }
  149. ito2++;
  150. }
  151. std::reverse(std::begin(povratni.kolekcija), std::end(povratni.kolekcija));
  152. return povratni;
  153. }
  154. TipE1 PronadjiPrvi()const
  155. {
  156. if(Velicina()==0) throw std::logic_error("Tok je prazan");
  157. return *std::begin(kolekcija);
  158. }
  159. TipE1 PronadjiPosljednji()const
  160. {
  161. if(Velicina()==0) throw std::logic_error("Tok je prazan");
  162. auto ito=std::end(kolekcija);
  163. ito--;
  164. return *ito;
  165. }
  166. bool ZadovoljavaBaremJedan(std::function<bool(TipE1)>kriterij)const
  167. {
  168. auto ito=std::begin(kolekcija);
  169. while(ito!=std::end(kolekcija))
  170. {
  171. if(kriterij(*ito)) return true;
  172. ito++;
  173. }
  174. return false;
  175. }
  176. bool ZadovoljavaNijedan(std::function<bool(TipE1)>kriterij)const
  177. {
  178. auto ito=std::begin(kolekcija);
  179. while(ito!=std::end(kolekcija))
  180. {
  181. if(kriterij(*ito)) return false;
  182. ito++;
  183. }
  184. return true;
  185. }
  186. bool ZadovoljavajuSvi(std::function<bool(TipE1)>kriterij)const
  187. {
  188. auto ito=std::begin(kolekcija);
  189. while(ito!=std::end(kolekcija))
  190. {
  191. if(!kriterij(*ito)) return false;
  192. ito++;
  193. }
  194. return true;
  195. }
  196. TipE1 Akumuliraj(TipE1 inicijalna, std::function<TipE1(TipE1, TipE1)>akumulator)const
  197. {
  198. if(Velicina()==0) return inicijalna;
  199. auto ito=std::begin(kolekcija);
  200. TipE1 povratna;
  201. povratna=akumulator(inicijalna, *ito);
  202. ito++;
  203. while(ito!=std::end(kolekcija))
  204. {
  205. povratna=akumulator(povratna, *ito);
  206. ito++;
  207. }
  208. return povratna;
  209. }
  210. TipE1 Akumuliraj(std::function<TipE1(TipE1, TipE1)>akumulator)const
  211. {
  212. if(Velicina()==0) throw std::logic_error("Tok je prazan");
  213. auto ito1=std::begin(kolekcija);
  214. if(Velicina()==1) return *ito1;
  215. auto ito2=std::begin(kolekcija);
  216. ito2++;
  217. TipE1 povratna;
  218. povratna=akumulator(*ito1, *ito2);
  219. ito2++;
  220. while(ito2!=std::end(kolekcija))
  221. {
  222. povratna=akumulator(povratna, *ito2);
  223. ito2++;
  224. }
  225. return povratna;
  226. }
  227. Tok<TipE1, Kontejner>Sortirano(std::function<bool(TipE1, TipE1)>komparator=
  228. [](TipE1 x, TipE1 y){return x<y;})const
  229. {
  230. Tok povratni{};
  231. auto ito1=std::begin(povratni.kolekcija);
  232. auto ito2=std::begin(kolekcija);
  233. while(ito2!=std::end(kolekcija))
  234. {
  235. ito1=povratni.kolekcija.insert(ito1, *ito2);
  236. ito2++;
  237. }
  238. std::sort(std::begin(povratni), std::end(povratni), komparator);
  239. return povratni;
  240. }
  241. Tok<TipE1, Kontejner>Unikatno(std::function<bool(TipE1, TipE1)>komparator=
  242. [](TipE1 x, TipE1 y){return x==y;})const
  243. {
  244. Tok povratni{};
  245. auto ito1=std::begin(povratni.kolekcija);
  246. auto ito2=std::begin(kolekcija);
  247. while(ito2!=std::end(kolekcija))
  248. {
  249. auto ito3=std::begin(povratni.kolekcija);
  250. bool provjera(true);
  251. while(ito3!=std::end(povratni.kolekcija))
  252. {
  253. if(komparator(*ito2, *ito3))
  254. {
  255. provjera=false;
  256. break;
  257. }
  258. ito3++;
  259. }
  260. if(provjera==true)
  261. {
  262. ito1=povratni.kolekcija.insert(ito1, *ito2);
  263. }
  264. ito2++;
  265. }
  266. std::reverse(std::begin(povratni.kolekcija), std::end(povratni.kolekcija));
  267. return povratni;
  268. }
  269. Tok<TipE1, Kontejner>Proviri(std::function<void(TipE1)>akcija)const
  270. {
  271. Tok povratni{};
  272. std::copy(std::begin(kolekcija), std::end(kolekcija), povratni);
  273. std::for_each(std::begin(kolekcija), std::end(kolekcija), akcija);
  274. return povratni;
  275. }
  276. TipE1 Minimalan(std::function<bool(TipE1, TipE1)>komparator=
  277. [](TipE1 x, TipE1 y){return x<y;})const
  278. {
  279. if(Velicina()==0) throw std::logic_error("Tok je prazan");
  280. auto it=std::min_element(std::begin(kolekcija), std::end(kolekcija), komparator);
  281. return *it;
  282. }
  283. TipE1 Maksimalan(std::function<bool(TipE1, TipE1)>komparator=
  284. [](TipE1 x, TipE1 y){return x>y;})const
  285. {
  286. if(Velicina()==0) throw std::logic_error("Tok je prazan");
  287. auto it=std::min_element(std::begin(kolekcija), std::end(kolekcija), komparator);
  288. return *it;
  289. }
  290. template<typename Kont2>
  291. Kont2 Sakupi(std::function<void(Kont2 &, TipE1)>kombinator)const
  292. {
  293. std::for_each(std::begin(kolekcija), std::end(kolekcija), std::bind(kombinator, povratna, std::placeholders::_1 ))
  294. return povratni;
  295.  
  296. }
  297. template<typename TipE12>
  298. Tok<TipE12, Kontejner> Mapiraj(std::function<TipE12(TipE1)>maper)const
  299. {
  300. Kontejner<TipE12>povratni;
  301. for(auto ito=std::begin(kolekcija); ito!=std::end(kolekcija); ito++)
  302. {
  303. ito=povratni.insert(std::begin(povratni), maper(*ito));
  304. }
  305. std::reverse(std::begin(povratni), std::end(povratni));
  306. Tok<TipE12, Kontejner>vrati(std::begin(povratni), std::end(povratni));
  307. return vrati;
  308.  
  309. }
  310. template<typename TipE12>
  311. Tok<TipE12, Kontejner> MapirajPoravnato(
  312. std::function<Tok<TipE12, Kontejner>(TipE1)>maper)const*/
  313.  
  314. };
  315.  
  316. int main ()
  317. {
  318.  
  319. std::cout << Tok<int>{1, 500, 8, 100}.Maksimalan()<<std::endl;
  320. std::cout << Tok<int>{111, 7, 8, 100}.Minimalan();
  321.  
  322. return 0;
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement