CINXE.COM

Generičko programiranje – Wikipedija/Википедија

<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="sh-Latn" dir="ltr"> <head> <meta charset="UTF-8"> <title>Generičko programiranje – Wikipedija/Википедија</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )shwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":[",\t.",".\t,"],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy sh-latn","wgMonthNames":["","januar","februar","mart","april","maj","juni","juli","august","septembar","oktobar","novembar","decembar"],"wgRequestId":"d3202e29-b0da-4965-bab4-f3ec1a6a9a9c","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Generičko_programiranje","wgTitle":"Generičko programiranje","wgCurRevisionId":41273773,"wgRevisionId":41273773,"wgArticleId":4631537,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Programiranje","Programske paradigme"],"wgPageViewLanguage":"sh-latn","wgPageContentLanguage":"sh-latn","wgPageContentModel":"wikitext","wgRelevantPageName":"Generičko_programiranje","wgRelevantArticleId":4631537,"wgTempUserName":null,"wgUserVariant":"sh-latn","wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive" :false,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"sh","pageLanguageDir":"ltr","pageVariantFallbacks":"sh-latn"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":true,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":80000,"wgRelatedArticlesCompat":[],"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q1051282","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":false,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false,"wgSiteNoticeId":"2.8"};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready", "user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.cite.styles":"ready","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready","ext.dismissableSiteNotice.styles":"ready"};RLPAGEMODULES=["ext.cite.ux-enhancements","ext.pygments.view","site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.ReferenceTooltips","ext.gadget.charinsert","ext.urlShortener.toolbar","ext.centralauth.centralautologin","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface", "ext.cx.eventlogging.campaigns","ext.cx.uls.quick.actions","wikibase.client.vector-2022","ext.checkUser.clientHints","ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking","ext.dismissableSiteNotice"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});mw.user.options.set({"language":"sh-latn"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=sh-latn&amp;modules=ext.cite.styles%7Cext.dismissableSiteNotice.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&amp;only=styles&amp;skin=vector-2022"> <script async="" src="/w/load.php?lang=sh-latn&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=sh-latn&amp;modules=site.styles&amp;only=styles&amp;skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.5"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Generičko programiranje – Wikipedija/Википедија"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//sh.m.wikipedia.org/wiki/Generi%C4%8Dko_programiranje"> <link rel="alternate" type="application/x-wiki" title="Uredi" href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedija (sh)"> <link rel="EditURI" type="application/rsd+xml" href="//sh.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://sh.wikipedia.org/wiki/Generi%C4%8Dko_programiranje"> <link rel="alternate" hreflang="sh" href="https://sh.wikipedia.org/wiki/Generi%C4%8Dko_programiranje"> <link rel="alternate" hreflang="sh-Cyrl" href="https://sh.wikipedia.org/w/index.php?title=Generi%C4%8Dko_programiranje&amp;variant=sh-cyrl"> <link rel="alternate" hreflang="sh-Latn" href="https://sh.wikipedia.org/w/index.php?title=Generi%C4%8Dko_programiranje&amp;variant=sh-latn"> <link rel="alternate" hreflang="x-default" href="https://sh.wikipedia.org/wiki/Generi%C4%8Dko_programiranje"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.sh"> <link rel="alternate" type="application/atom+xml" title="Wikipedija Atom fid" href="/w/index.php?title=Posebno:Nedavne_izmjene&amp;feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Generičko_programiranje rootpage-Generičko_programiranje skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Prijeđi na sadržaj</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Sajt"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" lang="sh-Latn" dir="ltr"> <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Glavni meni" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Glavni meni</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Glavni meni</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">premjesti na bočnu traku</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">sakrij</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" lang="sh-Latn" dir="ltr"> <div class="vector-menu-heading"> Navigacija </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Glavna_stranica" title="Posjetite glavnu stranicu [z]" accesskey="z"><span>Glavna stranica</span></a></li><li id="n-featuredcontent" class="mw-list-item"><a href="/wiki/Wikipedija:Istaknuti_%C4%8Dlanci" title="Pronađite najkvalitetnije članke"><span>Istaknuti članci</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Posebno:Nedavne_izmjene" title="Prelistajte nove izmjene [r]" accesskey="r"><span>Nedavne izmjene</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Posebno:Slu%C4%8Dajna_stranica" title="Otvorite slučajan članak [x]" accesskey="x"><span>Nasumičan članak</span></a></li> </ul> </div> </div> <div id="p-interaction" class="vector-menu mw-portlet mw-portlet-interaction" lang="sh-Latn" dir="ltr"> <div class="vector-menu-heading"> Interakcija </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Pomo%C4%87:Sadr%C5%BEaj" title="Saznajte više o upotrebi i uređivanju"><span>Pomoć</span></a></li><li id="n-sidebar-village-pump" class="mw-list-item"><a href="/wiki/Wikipedija:Pijaca"><span>Pijaca</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedija:Portal_zajednice" title="Pronađite aktualne zadatke i akcije"><span>Radionica</span></a></li><li id="n-currentevents" class="mw-list-item"><a href="/wiki/Wikipedija:Novosti" title="Pogledajte tekuće događaje i aktualnosti"><span>Novosti</span></a></li><li id="n-forum" class="mw-list-item"><a href="https://forum.movement-strategy.org/c/general/meduprojektniforum/40" rel="nofollow"><span>Međuprojektni forum</span></a></li><li id="n-discord" class="mw-list-item"><a href="https://discord.gg/khcKdUUxYY" rel="nofollow"><span>Discord</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Glavna_stranica" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedija" src="/static/images/mobile/copyright/wikipedia-wordmark-sh-latn.svg" style="width: 7.5em; height: 2em;"> <img class="mw-logo-tagline" alt="" src="/static/images/mobile/copyright/wikipedia-tagline-sh-latn.svg" width="120" height="18" style="width: 7.5em; height: 1.125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Posebno:Tra%C5%BEi" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Pretražite Wikipediju [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Pretraga</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Pretražite Wikipediju" aria-label="Pretražite Wikipediju" autocapitalize="sentences" title="Pretražite Wikipediju [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Posebno:Traži"> </div> <button class="cdx-button cdx-search-input__end-button">Pretraži</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Osobne alatke"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Izgled"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page&#039;s font size, width, and color" lang="sh-Latn" dir="ltr"> <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Izgled" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Izgled</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_sh.wikipedia.org&amp;uselang=sh" class=""><span>Donacije</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Posebno:Stvori_ra%C4%8Dun&amp;returnto=Generi%C4%8Dko+programiranje" title="Preporučujemo da izradite račun i prijavite se, ali to nije obavezno" class=""><span>Izradi račun</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Posebno:Korisni%C4%8Dka_prijava&amp;returnto=Generi%C4%8Dko+programiranje" title="Preporučujemo da se prijavite, ali to nije obavezno [o]" accesskey="o" class=""><span>Prijavi me</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out user-links-collapsible-item" title="Više mogućnosti" lang="sh-Latn" dir="ltr"> <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Osobne alatke" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Osobne alatke</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="Korisnički meni" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_sh.wikipedia.org&amp;uselang=sh"><span>Donacije</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Posebno:Stvori_ra%C4%8Dun&amp;returnto=Generi%C4%8Dko+programiranje" title="Preporučujemo da izradite račun i prijavite se, ali to nije obavezno"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Izradi račun</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Posebno:Korisni%C4%8Dka_prijava&amp;returnto=Generi%C4%8Dko+programiranje" title="Preporučujemo da se prijavite, ali to nije obavezno [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Prijavi me</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><div id="mw-dismissablenotice-anonplace"></div><script>(function(){var node=document.getElementById("mw-dismissablenotice-anonplace");if(node){node.outerHTML="\u003Cdiv class=\"mw-dismissable-notice\"\u003E\u003Cdiv class=\"mw-dismissable-notice-close\"\u003E[\u003Ca tabindex=\"0\" role=\"button\"\u003Ezatvori\u003C/a\u003E]\u003C/div\u003E\u003Cdiv class=\"mw-dismissable-notice-body\"\u003E\u003C!-- CentralNotice --\u003E\u003Cdiv id=\"localNotice\" data-nosnippet=\"\"\u003E\u003Cdiv class=\"anonnotice\" lang=\"sh\" dir=\"ltr\"\u003E\u003Ctable class=\"plainlinks fmbox fmbox-system\" style=\"clear: both; margin: 0.2em 0; border: 1px solid #aaa; background: #f9f9f9; width: 100%; background: #f9f9f9; border:1px solid black; padding: 2px 5px\"\u003E\n\u003Ctbody\u003E\u003Ctr\u003E\t\n\u003Ctd class=\"mbox-image\"\u003E\n \u003Cspan typeof=\"mw:File\"\u003E\u003Ca href=\"/wiki/Wikipedija:Mjesec_Azije/2024\" title=\"Wikipedija:Mjesec Azije/2024\"\u003E\u003Cimg src=\"//upload.wikimedia.org/wikipedia/commons/thumb/1/1f/WAM_logo_without_text.svg/25px-WAM_logo_without_text.svg.png\" decoding=\"async\" width=\"25\" height=\"27\" class=\"mw-file-element\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/1/1f/WAM_logo_without_text.svg/38px-WAM_logo_without_text.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/1f/WAM_logo_without_text.svg/50px-WAM_logo_without_text.svg.png 2x\" data-file-width=\"800\" data-file-height=\"859\" /\u003E\u003C/a\u003E\u003C/span\u003E\u003C/td\u003E\n\u003Ctd class=\"mbox-text\" style=\"\"\u003E Od 1. do 30. novembra održava se uređivački maraton \u003Ca href=\"/wiki/Wikipedija:Mjesec_Azije/2024\" title=\"Wikipedija:Mjesec Azije/2024\"\u003EMjesec Azije\u003C/a\u003E. \u003C/td\u003E\n\u003C/tr\u003E\n\u003C/tbody\u003E\u003C/table\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E";}}());</script></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Sajt"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Sadržaj" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Sadržaj</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">premjesti na bočnu traku</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">sakrij</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Početak</div> </a> </li> <li id="toc-Generičke_funkcije_i_klase_–_template[1]" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generičke_funkcije_i_klase_–_template[1]"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Generičke funkcije i klase – template<sup><span>[</span>1<span>]</span></sup></span> </div> </a> <ul id="toc-Generičke_funkcije_i_klase_–_template[1]-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Generički_klasni_tipovi[3]" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generički_klasni_tipovi[3]"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Generički klasni tipovi<sup><span>[</span>3<span>]</span></sup></span> </div> </a> <ul id="toc-Generički_klasni_tipovi[3]-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Generički_metod" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generički_metod"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Generički metod</span> </div> </a> <ul id="toc-Generički_metod-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Nizovi_i_parametrizovani_tipovi" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Nizovi_i_parametrizovani_tipovi"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Nizovi i parametrizovani tipovi</span> </div> </a> <ul id="toc-Nizovi_i_parametrizovani_tipovi-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Kolekcije" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Kolekcije"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Kolekcije</span> </div> </a> <button aria-controls="toc-Kolekcije-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Kolekcije</span> </button> <ul id="toc-Kolekcije-sublist" class="vector-toc-list"> <li id="toc-Skup" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Skup"> <div class="vector-toc-text"> <span class="vector-toc-numb">5.1</span> <span>Skup</span> </div> </a> <ul id="toc-Skup-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Niz" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Niz"> <div class="vector-toc-text"> <span class="vector-toc-numb">5.2</span> <span>Niz</span> </div> </a> <ul id="toc-Niz-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Iterator" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Iterator"> <div class="vector-toc-text"> <span class="vector-toc-numb">6</span> <span>Iterator</span> </div> </a> <button aria-controls="toc-Iterator-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Iterator</span> </button> <ul id="toc-Iterator-sublist" class="vector-toc-list"> <li id="toc-List_iteratori" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#List_iteratori"> <div class="vector-toc-text"> <span class="vector-toc-numb">6.1</span> <span>List iteratori</span> </div> </a> <ul id="toc-List_iteratori-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-ArrayList" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#ArrayList"> <div class="vector-toc-text"> <span class="vector-toc-numb">7</span> <span>ArrayList</span> </div> </a> <button aria-controls="toc-ArrayList-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju ArrayList</span> </button> <ul id="toc-ArrayList-sublist" class="vector-toc-list"> <li id="toc-Konstruktori" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Konstruktori"> <div class="vector-toc-text"> <span class="vector-toc-numb">7.1</span> <span>Konstruktori</span> </div> </a> <ul id="toc-Konstruktori-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Metode" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Metode"> <div class="vector-toc-text"> <span class="vector-toc-numb">7.2</span> <span>Metode</span> </div> </a> <ul id="toc-Metode-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Povezana_lista_(LinkedList)" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Povezana_lista_(LinkedList)"> <div class="vector-toc-text"> <span class="vector-toc-numb">8</span> <span>Povezana lista (LinkedList)</span> </div> </a> <button aria-controls="toc-Povezana_lista_(LinkedList)-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Povezana lista (LinkedList)</span> </button> <ul id="toc-Povezana_lista_(LinkedList)-sublist" class="vector-toc-list"> <li id="toc-Konstuktori" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Konstuktori"> <div class="vector-toc-text"> <span class="vector-toc-numb">8.1</span> <span>Konstuktori</span> </div> </a> <ul id="toc-Konstuktori-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Metode_2" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Metode_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">8.2</span> <span>Metode</span> </div> </a> <ul id="toc-Metode_2-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Katalozi" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Katalozi"> <div class="vector-toc-text"> <span class="vector-toc-numb">9</span> <span>Katalozi</span> </div> </a> <ul id="toc-Katalozi-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Heširanje" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Heširanje"> <div class="vector-toc-text"> <span class="vector-toc-numb">10</span> <span>Heširanje</span> </div> </a> <button aria-controls="toc-Heširanje-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Heširanje</span> </button> <ul id="toc-Heširanje-sublist" class="vector-toc-list"> <li id="toc-Konstuktori_za_HashMap&lt;&gt;" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Konstuktori_za_HashMap&lt;&gt;"> <div class="vector-toc-text"> <span class="vector-toc-numb">10.1</span> <span>Konstuktori za HashMap&lt;></span> </div> </a> <ul id="toc-Konstuktori_za_HashMap&lt;&gt;-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Generičke_klase" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generičke_klase"> <div class="vector-toc-text"> <span class="vector-toc-numb">11</span> <span>Generičke klase</span> </div> </a> <ul id="toc-Generičke_klase-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Specijalizacija_šablona" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Specijalizacija_šablona"> <div class="vector-toc-text"> <span class="vector-toc-numb">12</span> <span>Specijalizacija šablona</span> </div> </a> <ul id="toc-Specijalizacija_šablona-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Šabloni_sa_konstantnim_parametrima" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Šabloni_sa_konstantnim_parametrima"> <div class="vector-toc-text"> <span class="vector-toc-numb">13</span> <span>Šabloni sa konstantnim parametrima</span> </div> </a> <ul id="toc-Šabloni_sa_konstantnim_parametrima-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Predodređeni_i_funkcijski_parametri_šablona" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Predodređeni_i_funkcijski_parametri_šablona"> <div class="vector-toc-text"> <span class="vector-toc-numb">14</span> <span>Predodređeni i funkcijski parametri šablona</span> </div> </a> <ul id="toc-Predodređeni_i_funkcijski_parametri_šablona-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Poređenje_šablona_i_makro_naredbi" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Poređenje_šablona_i_makro_naredbi"> <div class="vector-toc-text"> <span class="vector-toc-numb">15</span> <span>Poređenje šablona i makro naredbi</span> </div> </a> <ul id="toc-Poređenje_šablona_i_makro_naredbi-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Definicija_i_upotreba_klase_tvector&lt;class_T&gt;" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Definicija_i_upotreba_klase_tvector&lt;class_T&gt;"> <div class="vector-toc-text"> <span class="vector-toc-numb">16</span> <span>Definicija i upotreba klase tvector&lt;class T></span> </div> </a> <ul id="toc-Definicija_i_upotreba_klase_tvector&lt;class_T&gt;-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Reference" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Reference"> <div class="vector-toc-text"> <span class="vector-toc-numb">17</span> <span>Reference</span> </div> </a> <ul id="toc-Reference-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Generičke_funkcije_i_klase_–_template[1]_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generičke_funkcije_i_klase_–_template[1]_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">18</span> <span>Generičke funkcije i klase – template<sup><span>[</span>1<span>]</span></sup></span> </div> </a> <ul id="toc-Generičke_funkcije_i_klase_–_template[1]_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Generički_klasni_tipovi[3]_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generički_klasni_tipovi[3]_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">19</span> <span>Generički klasni tipovi<sup><span>[</span>3<span>]</span></sup></span> </div> </a> <ul id="toc-Generički_klasni_tipovi[3]_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Generički_metod_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generički_metod_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">20</span> <span>Generički metod</span> </div> </a> <ul id="toc-Generički_metod_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Nizovi_i_parametrizovani_tipovi_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Nizovi_i_parametrizovani_tipovi_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">21</span> <span>Nizovi i parametrizovani tipovi</span> </div> </a> <ul id="toc-Nizovi_i_parametrizovani_tipovi_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Kolekcije_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Kolekcije_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">22</span> <span>Kolekcije</span> </div> </a> <button aria-controls="toc-Kolekcije_2-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Kolekcije</span> </button> <ul id="toc-Kolekcije_2-sublist" class="vector-toc-list"> <li id="toc-Skup_2" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Skup_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">22.1</span> <span>Skup</span> </div> </a> <ul id="toc-Skup_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Niz_2" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Niz_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">22.2</span> <span>Niz</span> </div> </a> <ul id="toc-Niz_2-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Iterator_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Iterator_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">23</span> <span>Iterator</span> </div> </a> <button aria-controls="toc-Iterator_2-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Iterator</span> </button> <ul id="toc-Iterator_2-sublist" class="vector-toc-list"> <li id="toc-List_iteratori_2" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#List_iteratori_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">23.1</span> <span>List iteratori</span> </div> </a> <ul id="toc-List_iteratori_2-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-ArrayList_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#ArrayList_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">24</span> <span>ArrayList</span> </div> </a> <button aria-controls="toc-ArrayList_2-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju ArrayList</span> </button> <ul id="toc-ArrayList_2-sublist" class="vector-toc-list"> <li id="toc-Konstruktori_2" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Konstruktori_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">24.1</span> <span>Konstruktori</span> </div> </a> <ul id="toc-Konstruktori_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Metode_3" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Metode_3"> <div class="vector-toc-text"> <span class="vector-toc-numb">24.2</span> <span>Metode</span> </div> </a> <ul id="toc-Metode_3-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Povezana_lista_(LinkedList)_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Povezana_lista_(LinkedList)_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">25</span> <span>Povezana lista (LinkedList)</span> </div> </a> <button aria-controls="toc-Povezana_lista_(LinkedList)_2-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Povezana lista (LinkedList)</span> </button> <ul id="toc-Povezana_lista_(LinkedList)_2-sublist" class="vector-toc-list"> <li id="toc-Konstuktori_2" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Konstuktori_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">25.1</span> <span>Konstuktori</span> </div> </a> <ul id="toc-Konstuktori_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Metode_4" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Metode_4"> <div class="vector-toc-text"> <span class="vector-toc-numb">25.2</span> <span>Metode</span> </div> </a> <ul id="toc-Metode_4-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Katalozi_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Katalozi_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">26</span> <span>Katalozi</span> </div> </a> <ul id="toc-Katalozi_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Heširanje_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Heširanje_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">27</span> <span>Heširanje</span> </div> </a> <button aria-controls="toc-Heširanje_2-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Uključi/isključi podsekciju Heširanje</span> </button> <ul id="toc-Heširanje_2-sublist" class="vector-toc-list"> <li id="toc-Konstuktori_za_HashMap&lt;&gt;_2" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Konstuktori_za_HashMap&lt;&gt;_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">27.1</span> <span>Konstuktori za HashMap&lt;></span> </div> </a> <ul id="toc-Konstuktori_za_HashMap&lt;&gt;_2-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Generičke_klase_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Generičke_klase_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">28</span> <span>Generičke klase</span> </div> </a> <ul id="toc-Generičke_klase_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Specijalizacija_šablona_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Specijalizacija_šablona_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">29</span> <span>Specijalizacija šablona</span> </div> </a> <ul id="toc-Specijalizacija_šablona_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Šabloni_sa_konstantnim_parametrima_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Šabloni_sa_konstantnim_parametrima_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">30</span> <span>Šabloni sa konstantnim parametrima</span> </div> </a> <ul id="toc-Šabloni_sa_konstantnim_parametrima_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Predodređeni_i_funkcijski_parametri_šablona_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Predodređeni_i_funkcijski_parametri_šablona_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">31</span> <span>Predodređeni i funkcijski parametri šablona</span> </div> </a> <ul id="toc-Predodređeni_i_funkcijski_parametri_šablona_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Poređenje_šablona_i_makro_naredbi_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Poređenje_šablona_i_makro_naredbi_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">32</span> <span>Poređenje šablona i makro naredbi</span> </div> </a> <ul id="toc-Poređenje_šablona_i_makro_naredbi_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Definicija_i_upotreba_klase_tvector&lt;class_T&gt;_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Definicija_i_upotreba_klase_tvector&lt;class_T&gt;_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">33</span> <span>Definicija i upotreba klase tvector&lt;class T></span> </div> </a> <ul id="toc-Definicija_i_upotreba_klase_tvector&lt;class_T&gt;_2-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Reference_2" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Reference_2"> <div class="vector-toc-text"> <span class="vector-toc-numb">34</span> <span>Reference</span> </div> </a> <ul id="toc-Reference_2-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Sadržaj" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" lang="sh-Latn" dir="ltr"> <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Prikaži/sakrij sadržaj" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Prikaži/sakrij sadržaj</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading" lang="sh-Latn" dir="ltr"><span class="mw-page-title-main">Generičko programiranje</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" lang="sh-Latn" dir="ltr"> <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Prijedi na druge jezične varijante članka. Dostupno je na 30 jezika" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-30" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">30 jezika</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-be mw-list-item"><a href="https://be.wikipedia.org/wiki/%D0%90%D0%B1%D0%B0%D0%B3%D1%83%D0%BB%D1%8C%D0%BD%D0%B5%D0%BD%D0%B0%D0%B5_%D0%BF%D1%80%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%B0%D0%B2%D0%B0%D0%BD%D0%BD%D0%B5" title="Абагульненае праграмаванне — Beloruski" lang="be" hreflang="be" data-title="Абагульненае праграмаванне" data-language-autonym="Беларуская" data-language-local-name="Beloruski" class="interlanguage-link-target"><span>Беларуская</span></a></li><li class="interlanguage-link interwiki-bg mw-list-item"><a href="https://bg.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BD%D0%B8_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%D0%B5" title="Шаблонни типове — Bugarski" lang="bg" hreflang="bg" data-title="Шаблонни типове" data-language-autonym="Български" data-language-local-name="Bugarski" class="interlanguage-link-target"><span>Български</span></a></li><li class="interlanguage-link interwiki-ca mw-list-item"><a href="https://ca.wikipedia.org/wiki/Programaci%C3%B3_gen%C3%A8rica" title="Programació genèrica — Katalonski" lang="ca" hreflang="ca" data-title="Programació genèrica" data-language-autonym="Català" data-language-local-name="Katalonski" class="interlanguage-link-target"><span>Català</span></a></li><li class="interlanguage-link interwiki-cs mw-list-item"><a href="https://cs.wikipedia.org/wiki/Generick%C3%A9_programov%C3%A1n%C3%AD" title="Generické programování — Češki" lang="cs" hreflang="cs" data-title="Generické programování" data-language-autonym="Čeština" data-language-local-name="Češki" class="interlanguage-link-target"><span>Čeština</span></a></li><li class="interlanguage-link interwiki-de mw-list-item"><a href="https://de.wikipedia.org/wiki/Generische_Programmierung" title="Generische Programmierung — Nemački" lang="de" hreflang="de" data-title="Generische Programmierung" data-language-autonym="Deutsch" data-language-local-name="Nemački" class="interlanguage-link-target"><span>Deutsch</span></a></li><li class="interlanguage-link interwiki-en mw-list-item"><a href="https://en.wikipedia.org/wiki/Generic_programming" title="Generic programming — Engleski" lang="en" hreflang="en" data-title="Generic programming" data-language-autonym="English" data-language-local-name="Engleski" class="interlanguage-link-target"><span>English</span></a></li><li class="interlanguage-link interwiki-es mw-list-item"><a href="https://es.wikipedia.org/wiki/Programaci%C3%B3n_gen%C3%A9rica" title="Programación genérica — Španski" lang="es" hreflang="es" data-title="Programación genérica" data-language-autonym="Español" data-language-local-name="Španski" class="interlanguage-link-target"><span>Español</span></a></li><li class="interlanguage-link interwiki-et mw-list-item"><a href="https://et.wikipedia.org/wiki/%C3%9Cldistav_programmeerimine" title="Üldistav programmeerimine — Estonski" lang="et" hreflang="et" data-title="Üldistav programmeerimine" data-language-autonym="Eesti" data-language-local-name="Estonski" class="interlanguage-link-target"><span>Eesti</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wikipedia.org/wiki/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C_%D9%87%D9%85%DA%AF%D8%A7%D9%86%DB%8C" title="برنامه‌نویسی همگانی — Persijski" lang="fa" hreflang="fa" data-title="برنامه‌نویسی همگانی" data-language-autonym="فارسی" data-language-local-name="Persijski" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fi mw-list-item"><a href="https://fi.wikipedia.org/wiki/Geneerinen_ohjelmointi" title="Geneerinen ohjelmointi — Finski" lang="fi" hreflang="fi" data-title="Geneerinen ohjelmointi" data-language-autonym="Suomi" data-language-local-name="Finski" class="interlanguage-link-target"><span>Suomi</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9ricit%C3%A9" title="Généricité — Francuski" lang="fr" hreflang="fr" data-title="Généricité" data-language-autonym="Français" data-language-local-name="Francuski" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-he mw-list-item"><a href="https://he.wikipedia.org/wiki/%D7%AA%D7%9B%D7%A0%D7%95%D7%AA_%D7%92%D7%A0%D7%A8%D7%99" title="תכנות גנרי — Hebrejski" lang="he" hreflang="he" data-title="תכנות גנרי" data-language-autonym="עברית" data-language-local-name="Hebrejski" class="interlanguage-link-target"><span>עברית</span></a></li><li class="interlanguage-link interwiki-hr mw-list-item"><a href="https://hr.wikipedia.org/wiki/Generi%C4%8Dko_programiranje" title="Generičko programiranje — Hrvatski" lang="hr" hreflang="hr" data-title="Generičko programiranje" data-language-autonym="Hrvatski" data-language-local-name="Hrvatski" class="interlanguage-link-target"><span>Hrvatski</span></a></li><li class="interlanguage-link interwiki-hu mw-list-item"><a href="https://hu.wikipedia.org/wiki/Generikus_programoz%C3%A1s" title="Generikus programozás — Mađarski" lang="hu" hreflang="hu" data-title="Generikus programozás" data-language-autonym="Magyar" data-language-local-name="Mađarski" class="interlanguage-link-target"><span>Magyar</span></a></li><li class="interlanguage-link interwiki-hy mw-list-item"><a href="https://hy.wikipedia.org/wiki/%D4%B8%D5%B6%D5%A4%D5%B0%D5%A1%D5%B6%D6%80%D5%A1%D6%81%D5%BE%D5%A1%D5%AE_%D5%AE%D6%80%D5%A1%D5%A3%D6%80%D5%A1%D5%BE%D5%B8%D6%80%D5%B8%D6%82%D5%B4" title="Ընդհանրացված ծրագրավորում — Jermenski" lang="hy" hreflang="hy" data-title="Ընդհանրացված ծրագրավորում" data-language-autonym="Հայերեն" data-language-local-name="Jermenski" class="interlanguage-link-target"><span>Հայերեն</span></a></li><li class="interlanguage-link interwiki-it mw-list-item"><a href="https://it.wikipedia.org/wiki/Programmazione_generica" title="Programmazione generica — Italijanski" lang="it" hreflang="it" data-title="Programmazione generica" data-language-autonym="Italiano" data-language-local-name="Italijanski" class="interlanguage-link-target"><span>Italiano</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%83%83%E3%82%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" title="ジェネリックプログラミング — Japanski" lang="ja" hreflang="ja" data-title="ジェネリックプログラミング" data-language-autonym="日本語" data-language-local-name="Japanski" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-ko mw-list-item"><a href="https://ko.wikipedia.org/wiki/%EC%A0%9C%EB%84%A4%EB%A6%AD_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D" title="제네릭 프로그래밍 — Korejski" lang="ko" hreflang="ko" data-title="제네릭 프로그래밍" data-language-autonym="한국어" data-language-local-name="Korejski" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-nl mw-list-item"><a href="https://nl.wikipedia.org/wiki/Genericiteit" title="Genericiteit — Holandski" lang="nl" hreflang="nl" data-title="Genericiteit" data-language-autonym="Nederlands" data-language-local-name="Holandski" class="interlanguage-link-target"><span>Nederlands</span></a></li><li class="interlanguage-link interwiki-no mw-list-item"><a href="https://no.wikipedia.org/wiki/Generisk_programmering" title="Generisk programmering — Norveški bokmål" lang="nb" hreflang="nb" data-title="Generisk programmering" data-language-autonym="Norsk bokmål" data-language-local-name="Norveški bokmål" class="interlanguage-link-target"><span>Norsk bokmål</span></a></li><li class="interlanguage-link interwiki-pl mw-list-item"><a href="https://pl.wikipedia.org/wiki/Programowanie_uog%C3%B3lnione" title="Programowanie uogólnione — Poljski" lang="pl" hreflang="pl" data-title="Programowanie uogólnione" data-language-autonym="Polski" data-language-local-name="Poljski" class="interlanguage-link-target"><span>Polski</span></a></li><li class="interlanguage-link interwiki-pt mw-list-item"><a href="https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_gen%C3%A9rica" title="Programação genérica — Portugalski" lang="pt" hreflang="pt" data-title="Programação genérica" data-language-autonym="Português" data-language-local-name="Portugalski" class="interlanguage-link-target"><span>Português</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Обобщённое программирование — Ruski" lang="ru" hreflang="ru" data-title="Обобщённое программирование" data-language-autonym="Русский" data-language-local-name="Ruski" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-sl mw-list-item"><a href="https://sl.wikipedia.org/wiki/Generi%C4%8Dno_programiranje" title="Generično programiranje — Slovenački" lang="sl" hreflang="sl" data-title="Generično programiranje" data-language-autonym="Slovenščina" data-language-local-name="Slovenački" class="interlanguage-link-target"><span>Slovenščina</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wikipedia.org/wiki/Generi%C4%8Dko_programiranje" title="Generičko programiranje — Srpski" lang="sr" hreflang="sr" data-title="Generičko programiranje" data-language-autonym="Српски / srpski" data-language-local-name="Srpski" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-sv mw-list-item"><a href="https://sv.wikipedia.org/wiki/Generisk_programmering" title="Generisk programmering — Švedski" lang="sv" hreflang="sv" data-title="Generisk programmering" data-language-autonym="Svenska" data-language-local-name="Švedski" class="interlanguage-link-target"><span>Svenska</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/%D0%A3%D0%B7%D0%B0%D0%B3%D0%B0%D0%BB%D1%8C%D0%BD%D0%B5%D0%BD%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F" title="Узагальнене програмування — Ukrajinski" lang="uk" hreflang="uk" data-title="Узагальнене програмування" data-language-autonym="Українська" data-language-local-name="Ukrajinski" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-vi mw-list-item"><a href="https://vi.wikipedia.org/wiki/L%E1%BA%ADp_tr%C3%ACnh_t%E1%BB%95ng_qu%C3%A1t" title="Lập trình tổng quát — Vijetnamski" lang="vi" hreflang="vi" data-title="Lập trình tổng quát" data-language-autonym="Tiếng Việt" data-language-local-name="Vijetnamski" class="interlanguage-link-target"><span>Tiếng Việt</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wikipedia.org/wiki/%E6%B3%9B%E5%9E%8B%E7%BC%96%E7%A8%8B" title="泛型编程 — Kineski" lang="zh" hreflang="zh" data-title="泛型编程" data-language-autonym="中文" data-language-local-name="Kineski" class="interlanguage-link-target"><span>中文</span></a></li><li class="interlanguage-link interwiki-zh-yue mw-list-item"><a href="https://zh-yue.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E7%B7%A8%E7%A8%8B" title="通用編程 — kantonski" lang="yue" hreflang="yue" data-title="通用編程" data-language-autonym="粵語" data-language-local-name="kantonski" class="interlanguage-link-target"><span>粵語</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q1051282#sitelinks-wikipedia" title="Uredi međujezične poveznice" class="wbc-editpage">Uredi veze</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Imenski prostori"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Generi%C4%8Dko_programiranje" title="Vidi stranicu sadržaja [c]" accesskey="c"><span>Stranica</span></a></li><li id="ca-talk" class="new vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Razgovor:Generi%C4%8Dko_programiranje&amp;action=edit&amp;redlink=1" rel="discussion" class="new" title="Razgovarajte o sadržini ove stranice (stranica ne postoji) [t]" accesskey="t"><span>Razgovor</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown " lang="sh-Latn" dir="ltr"> <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Promijeni jezičnu varijantu" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Latinica</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-varlang-0" class="selected ca-variants-sh-Latn mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;variant=sh-latn" lang="sh-Latn" hreflang="sh-Latn"><span>Latinica</span></a></li><li id="ca-varlang-1" class="ca-variants-sh-Cyrl mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;variant=sh-cyrl" lang="sh-Cyrl" hreflang="sh-Cyrl"><span>Ћирилица</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Teme"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" lang="sh-Latn" dir="ltr"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Generi%C4%8Dko_programiranje"><span>Prikaži</span></a></li><li id="ca-ve-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit" title="Uredite ovu stranicu [v]" accesskey="v"><span>Uredi</span></a></li><li id="ca-edit" class="collapsible vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit" title="Uredite izvorni kod ove stranice [e]" accesskey="e"><span>Uredi kod</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=history" title="Pogledajte prethodne verzije ove stranice [h]" accesskey="h"><span>Historija</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Pomagala"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" lang="sh-Latn" dir="ltr"> <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Alatke" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Alatke</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Alati</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">premjesti na bočnu traku</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">sakrij</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="Više mogućnosti" lang="sh-Latn" dir="ltr"> <div class="vector-menu-heading"> Radnje </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Generi%C4%8Dko_programiranje"><span>Prikaži</span></a></li><li id="ca-more-ve-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit" title="Uredite ovu stranicu [v]" accesskey="v"><span>Uredi</span></a></li><li id="ca-more-edit" class="collapsible vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit" title="Uredite izvorni kod ove stranice [e]" accesskey="e"><span>Uredi kod</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=history"><span>Historija</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" lang="sh-Latn" dir="ltr"> <div class="vector-menu-heading"> Opšte </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Posebno:%C5%A0to_vodi_ovdje/Generi%C4%8Dko_programiranje" title="Pogledajte listu svih stranica koje vode ovamo [j]" accesskey="j"><span>Šta vodi ovamo</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Posebno:Povezane_izmjene/Generi%C4%8Dko_programiranje" rel="nofollow" title="Prelistajte nedavne izmjene stranica koje su povezane s ovom [k]" accesskey="k"><span>Povezane izmjene</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Posebno:Posebne_stranice" title="Pregledajte listu svih posebnih stranica [q]" accesskey="q"><span>Posebne stranice</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;oldid=41273773" title="Nabavite trajnu vezu do ove verzije stranice"><span>Trajna veza</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=info" title="Pronađite više informacija o ovoj stranici"><span>Podaci o stranici</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Posebno:Citiraj&amp;page=Generi%C4%8Dko_programiranje&amp;id=41273773&amp;wpFormIdentifier=titleform" title="Saznajte kako da citirate ovu stranicu"><span>Citiraj stranicu</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Posebno:Skra%C4%87iva%C4%8D_adresa&amp;url=https%3A%2F%2Fsh.wikipedia.org%2Fwiki%2FGeneri%25C4%258Dko_programiranje"><span>Skrati URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Posebno:QrCode&amp;url=https%3A%2F%2Fsh.wikipedia.org%2Fwiki%2FGeneri%25C4%258Dko_programiranje"><span>Preuzmi QR kod</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" lang="sh-Latn" dir="ltr"> <div class="vector-menu-heading"> Štampanje/izvoz </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Posebno:Kolekcija&amp;bookcmd=book_creator&amp;referer=Generi%C4%8Dko+programiranje"><span>Napravi knjigu</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Posebno:DownloadAsPdf&amp;page=Generi%C4%8Dko_programiranje&amp;action=show-download-screen"><span>Preuzmi kao PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;printable=yes" title="Odštampajte ovu stranicu [p]" accesskey="p"><span>Odštampaj</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" lang="sh-Latn" dir="ltr"> <div class="vector-menu-heading"> Na drugim projektima </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q1051282" title="Pogledajte povezanu stavku u skladištu podataka [g]" accesskey="g"><span>Stavka na Wikipodacima</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Pomagala"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Izgled"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Izgled</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">premjesti na bočnu traku</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">sakrij</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">Izvor: Wikipedija</div> </div> <div id="contentSub" lang="sh-Latn" dir="ltr"><div id="mw-content-subtitle" lang="sh-Latn" dir="ltr"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="sh-Latn" dir="ltr"><p>U računarstvu, <b>generičko programiranje</b> je tehnika koja dozvoljava da jedna promenljiva može da čuva različite <a href="/w/index.php?title=Tipovi_podataka&amp;action=edit&amp;redlink=1" class="new" title="Tipovi podataka (stranica ne postoji)">tipove podataka</a> (takozvana višeobličnost ili polimorfizam) sve dok su zadovoljeni određeni uslovi kao što su podklasa i pravilna deklaracija. Dakle, dozvoljava nam stvaranje <a href="/wiki/Funkcija_(programiranje)" title="Funkcija (programiranje)">funkcija</a>&#160;i klasa koje ne zavise od tipa. Primer: STL vektor, lista, stek itd. Na primer, ako se želi napraviti <a href="/w/index.php?title=Povezana_lista&amp;action=edit&amp;redlink=1" class="new" title="Povezana lista (stranica ne postoji)">lista</a> koristeći generičnost, moguća deklaracija bi bila List &lt;T&gt;, gde T predstavlja vrstu podataka. Kada se načini primerak može se napraviti List&lt;Integer&gt; ili List&lt;Animal&gt;. Prema listi se zatim postupa kao prema listi onog tipa podataka koji je naveden. Od objektno orijentisanih programskih jezika, programski jezici <a href="/wiki/C%2B%2B" title="C++">C++</a>, D, <a href="/w/index.php?title=BETA_(programming_language)&amp;action=edit&amp;redlink=1" class="new" title="BETA (programming language) (stranica ne postoji)">BETA</a>, <a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;redlink=1" class="new" title="Eiffel (programming language) (stranica ne postoji)">Eiffel</a>, <a href="/w/index.php?title=Ada_(programming_language)&amp;action=edit&amp;redlink=1" class="new" title="Ada (programming language) (stranica ne postoji)">Ada</a> i neke verzije <a href="/wiki/Java_(programski_jezik)" title="Java (programski jezik)">Jave</a> (1.5 i novije) podržavaju generičke tipove podataka. <a href="/w/index.php?title=Visual_Basic_.NET&amp;action=edit&amp;redlink=1" class="new" title="Visual Basic .NET (stranica ne postoji)">VB.NET</a> i <a href="/wiki/C_Sharp" title="C Sharp">C#</a> su počeli da podržavaju generičke tipove od verzije .NET 2.0. Šabloni – osnova za generičko programiranje:&#160; šablon je ustvari formula ili recept za stvaranje klase ili funkcije. Postoje funkcijski šabloni i šabloni klase. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Generičke_funkcije_i_klase_–_template[1]"><span id="Generi.C4.8Dke_funkcije_i_klase_.E2.80.93_template.5B1.5D"></span>Generičke funkcije i klase – template<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">&#91;</span>1<span class="cite-bracket">&#93;</span></a></sup></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=1" title="Uredi odjeljak Generičke funkcije i klase – template[1]" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=1" title="Uredi kôd odjeljka Generičke funkcije i klase – template[1]"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Pod pojmom generičkog programiranja podrazumeva se izrada programskog koda koji se u nepromenjenom obliku može primeniti na različite tipove podataka. </p><p> U C jeziku se za generičko programiranje koriste predprocesorske makro naredbe, npr:</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#define Kvadrat(x) x*x</span> </pre></div><p>Ovo je makro naredba kojom se deo koda koji je u zagradama označen sa x zamenjuje sa x*x. Makro naredbe nisu funkcije. One se realizuju u toku kompajliranja leksičkom zamenom teksta. </p><p>Primer: </p> <table class="wikitable"> <tbody><tr> <th>Makro naredba: </th> <th>Izvršava se kao: </th></tr> <tr> <td>int i; <p>Kvadrat(i) * 3 </p> </td> <td>int i; <p>i*i*3 </p> </td></tr> <tr> <td>float x; <p>x*Kvadrat(6.7) </p> </td> <td>float x; <p>x*6.7*6.7 </p> </td></tr> <tr> <td>float x; <p>x=Kvadrat(x+6.7) </p> </td> <td>float x; <p>x=x+6.7*x+6.7 </p><p>//greška </p> </td></tr></tbody></table><p> U prva dva primera pokazano je kako se ista makro naredba koristi za tipove int i float. Greška u trećem primeru, se može izbeći tako da se „argumenti“ makro naredbe napišu u zagradama tj.</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#define Kvadrat(x) (x)*(x)</span> </pre></div><p>Problem kod makroa je da je kod makroa nepregledan i teško je uočiti compile – greške, budući da kompajler samo kod makroa nalepi umesto poziva i moguće su semantičke greške koje je vrlo teško otkriti </p><p>To je jedan od razloga zbog kojeg u C++-u imamo generičke (template) funkcije (funkcijske šablone). C++ je strogo tipizirani jezik, tj pri definiciji funkcije moramo navesti tipove parametara. C++ dopušta korišćenje preopterećenih (overloaded) funkcija. To su funkcije koje imaju jednaka imena (i pripadaju istom dosegu – namespaceu) ali različitu listu parametara. Preopterećivanje funkcije ima nekoliko nedostataka: ukoliko želimo nešto promeniti u kodu funkcije moramo to učiniti na puno mesta, pa se povećava i mogućnost greške, ne možemo predvideti na kojim će sve tipovima korisnik hteti da pozove funkciju. </p><p> U C++ se isti efekat kao u C-u sa #define može postići korišćenjem definisanjem inline funkcija:</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">inline</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> <span class="kr">inline</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> <span class="kr">inline</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p><i>Preporuka:</i> bolje je da se koriste inline funkcije nego makro naredbe, jer se time osigurava bolja kontrola tipova i izbegava mogućnost pojave prethodno opisane greške. Primetimo da sva tri tipa definicije funkcije Kvadrat imaju isti oblik:</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="n">T</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>gde T može biti <i>int</i>, <i>float</i> ili <i>double</i>. Ova definicija ima generički oblik. U C++ jeziku se može vršiti generičko definisanje funkcija, na način da se ispred definicije ili deklaracije funkcije, pomoću ključne reči template, označi da T predstavlja „generički tip“.</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">Kvadrat</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>ili</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="n">typename</span><span class="w"> </span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Razlika u ova dva zapisa je u upotrebi ključne reči class ili typename, ali značenje je potpuno isto. Izvršenje poziva funkcije se mora obaviti sa stvarnim tipovima:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">;</span> <span class="n">y</span><span class="o">=</span><span class="n">Kvadrat</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="n">x</span><span class="p">);</span> </pre></div> <p>Pogodno je da se klase i funkcije mogu pisati generički, parametrizovano tipovima podataka. Takve generičke klase i funkcije nazivaju se u jeziku C++&#160; šablonima (templates). Iz šablona se generišu stvarne klase, odnosno funkcije, za konkretne tipove. Generički mehanizam<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">&#91;</span>2<span class="cite-bracket">&#93;</span></a></sup> je u potpunosti statički&#160;-substitucija parametara je u vreme&#160;prevođenja. Funkcijski šablon se ne koristi dok kompajler ne naiđe na poziv generičke funkcije. Tek tada se stvara i prevodi nova varijanta funkcije u zavisnosti o tipu na kojem je funkcija pozvana. Taj proces stvaranja nove konkretne varijante funkcije iz funkcijskog šablona naziva se instancijacija. Tipovi se kod funkcijskih šablona prepoznaju automatski. Zbog toga se i definicija i implementacija takvih funkcija piše u .h datoteku. Kompajler tek u trenutku poziva funkcije može odrediti način kako se prevodi generička funkcija, stoga su generičke funkcije po upotrebi&#160; ekvivalentne makro naredbama. Da bi se moglo izvršiti kompajliranje programa u kojem se koristi generička funkcija, kompajleru mora biti na raspolaganju potpuna definicija funkcije, a ne samo deklaracija funkcije kao što je slučaj kod upotrebe regularnih funkcija. </p><p> Generički tip T se može koristiti unutar funkcije za oznaku tipa lokalne promenljive:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">){</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">result</span><span class="o">=</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">result</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="n">k</span><span class="p">;</span><span class="w"> </span> <span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mf">10.9</span><span class="p">,</span><span class="n">b</span><span class="p">;</span> <span class="w"> </span><span class="n">k</span><span class="o">=</span><span class="n">Kvadrat</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="n">i</span><span class="p">);</span><span class="w"> </span> <span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="n">Kvadrat</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="n">k</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="n">b</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="mi">25</span> <span class="mf">118.81</span> </pre></div><p>Ne mora se uvek, pri pozivu funkcije, specificirati generički tip ako se iz tipova argumenata nedvosmisleno može zaključiti koji se parametarski tip koristi.</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="n">k</span><span class="p">;</span> <span class="kt">float</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mf">10.9</span><span class="p">,</span><span class="n">b</span><span class="p">;</span> <span class="n">k</span><span class="o">=</span><span class="n">Kvadrat</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> <span class="n">b</span><span class="o">=</span><span class="n">Kvadrat</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="n">k</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="n">cout</span><span class="o">&lt;&lt;</span><span class="n">b</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> </pre></div><p>Preporuka je ipak, da se uvek eksplicitno specifira parametarski tip. Mogu se definisati generičke funkcije sa više generičkih tipova. Primer:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="kd">class</span> <span class="nc">U</span><span class="o">&gt;</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="nf">GetMin</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="n">b</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="o">&lt;</span><span class="n">b</span><span class="o">?</span><span class="n">a</span><span class="p">:</span><span class="n">b</span><span class="p">);</span> <span class="p">}</span> </pre></div><p>definiše funkciju sa dva argumenata kojima se pridružuju generički tipovi T i U. Moguće je izvršiti poziv funkcije na sledeći način: ili još jednostavnije</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">i</span><span class="o">=</span><span class="n">GetMin</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="p">,</span><span class="n">l</span><span class="p">);</span> </pre></div><p>Iako su j i l različitog tipa, kompajler sam vrši konverzije integralnih tipova. </p><div class="mw-heading mw-heading2"><h2 id="Generički_klasni_tipovi[3]"><span id="Generi.C4.8Dki_klasni_tipovi.5B3.5D"></span>Generički klasni tipovi<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">&#91;</span>3<span class="cite-bracket">&#93;</span></a></sup></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=2" title="Uredi odjeljak Generički klasni tipovi[3]" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=2" title="Uredi kôd odjeljka Generički klasni tipovi[3]"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Pretpostavimo da radimo sa nekim skupom objekata koje želimo da nekako organizujemo. U tom slučaju koriste se klase koje se označavaju kao kolekcije (kolekcija=zbirka, skupljanje). One definišu objekte koji se koriste za organizaciju drugih objekata odgovarajućeg tipa u kolekcije na odgovarajući način. Moguće je u kolekciju dodavati objekte različitog tipa, ali onda imamo problem utvrđivanja tipa objekta prilikom njegovog korišćenja. Ako pokušamo da neki objekat iz ove kolekcije upotrebimo kao objekat neke druge klase, nailazimo na problem. Npr. neka smo omogućili da kolekciji mogu da se dodaju objekti klasa Tacka, Duz i String. Ako, primera radi, pokušamo da upotrebimo neki objekat klase Duz ili String kao objekat klase Tacka, program neće biti preveden. Da bi se izbegli ovakvi problemi, treba definisati kolekciju tako da se onemogući slučajno dodavanje objekta pogrešnog tipa. Jedan način za rešenje ovog problema je definisati zasebne kolekcije koje mogu da sadrže samo objekte jednog tipa. Ali onda se javlja drugi problem – imaćemo za svaki tip objekta po jednu klasu koja definiše odgovarajuću kolekciju. Drugi, efikasniji način, su upravo generički tipovi. Oni omogućuju da se definiše samo jedna klasa kojom je kolekcija predstavljena. Svi objekti u kolekciji su istog tipa, ali sada postoji mogućnost da taj tip može biti proizvoljan.&#160;Na ovaj način, imamo jednu kolekciju koja može da se ponaša i kao kolekcija tačaka, i kao kolekcija duži i kao kolekcija stringova itd. Generički tip je klasni ili interfejsni tip koji ima jedan ili više parametara. Definicija konkretne klase ili interfejsa iz generičkog tipa vrši se dodavanjem konkretnog argumenta za svaki od parametara generičkog tipa.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">LinkedList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>Parametar T se upotrebljava u definiciji metoda i polja gde postoji zavisnost od tipa ovog argumenta. Pojave ovog parametra u definiciji generičkog tipa se označavaju kao promenljive tipa, jer&#160; će biti zamenjene konkretnom vrednošću tog tipa, na isti način kao što parametri metoda bivaju zamenjeni argumentum koji se prosledi metodu. Kreiranje klase iz datog generičkog tipa vrši se navođenjem odgovarajućeg argumenta za parameter unutar &lt;&gt;. Sva pojavljivanja parametra T u definiciji generičkog tipa biće zamenjena datim argumentum. Generički tip na taj način definiše skup tipova, dobijenih za različite vrednosti parametra tipa T. Kao argument za parameter T može se proslediti samo klasni ili interfejsni tip. Primitivni tipovi&#160;ne mogu da se koriste. Umesto njih koristimo odgovarajuće klase koje ih enkapsuliraju. Generički tip LinkedList&lt;T&gt; koji čuva double vrednosti:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;</span><span class="w"> </span><span class="n">temp</span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;</span><span class="p">();</span> <span class="n">temp</span><span class="p">.</span><span class="na">addItem</span><span class="p">(</span><span class="mf">10.8</span><span class="p">)</span> </pre></div><p>Pošto je tip parametra Double kompajler automatski umeće konverziju vrednosti 10.8 iz double u Double. Možemo da definišemo generički tip koji definiše skup klasa koje obuhvataju par objekata proizvoljnog tipa. U tom slučaju definišemo generički tip sa dva parametra:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Par</span><span class="w"> </span><span class="o">&lt;</span><span class="n">TipKljuca</span><span class="p">,</span><span class="w"> </span><span class="n">TipVrednosti</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="nf">Par</span><span class="p">(</span><span class="n">TipKljuca</span><span class="w"> </span><span class="n">kljuc</span><span class="p">,</span><span class="w"> </span><span class="n">TipVrednosti</span><span class="w"> </span><span class="n">vr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">kljuc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">kljuc</span><span class="p">;</span> <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">vr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">vr</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="err">…</span> <span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">TipKljuca</span><span class="w"> </span><span class="n">kljuc</span><span class="p">;</span> <span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">TipVrednosti</span><span class="w"> </span><span class="n">vr</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Upotreba:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">Par</span><span class="w"> </span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="n">String</span><span class="o">&gt;</span><span class="n">unos</span><span class="w"> </span><span class="o">=</span><span class="k">new</span><span class="w"> </span><span class="n">Par</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="n">String</span><span class="o">&gt;</span><span class="p">(</span><span class="err">“</span><span class="n">Milan</span><span class="err">”</span><span class="p">,</span><span class="w"> </span><span class="err">“</span><span class="mi">4445555</span><span class="err">”</span><span class="p">);</span> </pre></div><p>Oblast važenja parametarskog tipa je cela generička klasa, isključujući statičke članice klase. Statička polja ne mogu biti definisana promenljivom tipa, niti statički metodi mogu da imaju parametre ili povratne vrednosti koje su parametarskog tipa. Ukoliko generička klasa sadrži neko statičko polje, svaki tip proizveden iz datog generičkog tipa, imaće svoju kopiju statičkog polja. Neka generička klasa LinkedList&lt;&gt; sadrži statičko polje count za brojanje kreiranih objekata. Svaka klasa dobijena iz generičke za konkretan argument tipa imaće svoju kopiju ovog polja. Na taj način, </p><p>count u klasi LinkedList&lt;String&gt; broji kreirane objekte ove klase </p><p>count u klasi LinkedList&lt;Point&gt; broji kreirane objekte ove klase itd. </p> <div class="mw-heading mw-heading2"><h2 id="Generički_metod"><span id="Generi.C4.8Dki_metod"></span>Generički metod</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=3" title="Uredi odjeljak Generički metod" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=3" title="Uredi kôd odjeljka Generički metod"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Možemo da definišemo metod sa svojim nezavisnim skupom od jednog ili više parametara. Takav metod naziva se parametarski metod ili generički metod. Generički metod može da postoji i unutar obične klase.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">ispisiSve</span><span class="p">(</span><span class="n">LinkedList</span><span class="w"> </span><span class="n">lista</span><span class="p">){</span> <span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">objekat</span><span class="p">:</span><span class="w"> </span><span class="n">lista</span><span class="p">)</span> <span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">objekat</span><span class="p">);</span> <span class="p">}</span> </pre></div><p>&lt;T&gt; ispred koga se navodi public ili static ključna reč predstavlja parametarski tip (ili listu tipova) za generički metod. Ovde imamo samo jedan parametarski tip za metod ispisiSve, ali ih može biti više. Lista parametarskih tipova se uvek pojavljuje između uglastih zagrada i navodi se iza kvalifikatora pristupa, a pre povratne vrednosti metoda. Argument tipa će biti određen na osnovu parametra tipa koji je prosleđen pri pozivu metoda. </p><div class="mw-heading mw-heading2"><h2 id="Nizovi_i_parametrizovani_tipovi">Nizovi i parametrizovani tipovi</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=4" title="Uredi odjeljak Nizovi i parametrizovani tipovi" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=4" title="Uredi kôd odjeljka Nizovi i parametrizovani tipovi"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Nizovi elemenata tipa dobijenog od generičkog tipa nisu dopušteni! </p> <div class="mw-heading mw-heading2"><h2 id="Kolekcije">Kolekcije</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=5" title="Uredi odjeljak Kolekcije" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=5" title="Uredi kôd odjeljka Kolekcije"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Java system kolekcija je skup generičkih tipova koje koristimo za kreiranje kolekcijskih klasa. Kolekcijska klasa je klasa koja organizuje skup objekata datog tipa na određen način (npr. lančane liste, stek,….). Najveći broj ovih klasa koje čine sistem kolekcija definisane su u paketu java.util. Razmotrićemo sledeće generičke tipove: </p> <ul><li>Iterator&lt;T&gt; interfejsni tip - deklariše metode za iteriranje kroz jedan po jedan element kolekcije</li></ul> <ul><li>ArrayList&lt;T&gt; tip -&#160;ima strukturu dinamičkog niza, broj objekata koje možemo sačuvati se automatski povećava po potrebi.</li></ul> <ul><li>LinkedList&lt;T&gt; tip - dvostruko povezana lista, omogućeno je iteriranje u oba smera</li></ul> <p>Klasu koja definiše kolekciju objekata često nazivamo kontejnerskom klasom. Postoje tri osnovna tipa kolekcija koji organizuju objekte na različite načine: </p> <ul><li>skupovi</li></ul> <ul><li>nizovi</li></ul> <ul><li>katalozi</li></ul> <div class="mw-heading mw-heading3"><h3 id="Skup">Skup</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=6" title="Uredi odjeljak Skup" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=6" title="Uredi kôd odjeljka Skup"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Skup(Set) je najjednostavnija kolekcija u kojoj objekti nisu na neki specijalan način uređeni I objekti se jednostavno dodaju skupu, bez ikakve kontrole gde idu. Možemo iterirati kroz sve objekte skupa, ispitati da li je neki objekat član skupa. Skup ne može da sadrži duplikate. Objekat možemo i obrisati iz skupa, ali samo ako imamo reference na njega u skupu. </p> <div class="mw-heading mw-heading3"><h3 id="Niz">Niz</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=7" title="Uredi odjeljak Niz" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=7" title="Uredi kôd odjeljka Niz"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Glavna karakteristika niza je da su objekti smešteni na linearan način, u proizvoljnom, fiksnom redosledu gde imamo početak i kraj. Kolekcije u opštem slučaju imaju sposobnost da se prošire da bi se smestio potreban broj objekata.Primeri: </p> <ul><li>Nizovi</li></ul> <ul><li><ul><li>ArrayList, Vector</li></ul></li></ul> <ul><li><ul><li>LinkedList</li></ul></li></ul> <ul><li>Redovi</li></ul> <ul><li><ul><li>Stack(LIFO)</li></ul></li></ul> <ul><li><ul><li>Queue(FIFO)</li></ul></li></ul> <p>Pošto je niz linearan, moguće je dodati novi objekat na početak ili kraj ili umetnuti novi objekat iza date pozicije. Dobijanje objekta iz niza se može izvršiti na vise načina: </p> <ol><li>Može se selektovati prvi ili poslednji</li> <li>Može se dobiti objekat sa date pozicije</li> <li>Može se pretraživati niz unapred ili unazad da bi se ispitalo da li se neki objekat nalazi u nizu i slično</li></ol> <div class="mw-heading mw-heading2"><h2 id="Iterator">Iterator</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=8" title="Uredi odjeljak Iterator" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=8" title="Uredi kôd odjeljka Iterator"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Iterator je objekat koji se koristi za iteriranje kroz kolekciju, tj. pristup jednom po jednom objektu kolekcije. Upotreba iteratora omoguće upotrebu oblika for petlje karakterističnog za pretraživanje kolekcija. Bilo koji objekat koji predstavlja skup ili niz može da kreira objekat tipa Iterator&lt;&gt;. Objekat tipa Iterator&lt;&gt; sadrži reference na sve objekte kolekcije u nekom redosledu i njima se može pristupiti pomoću metoda interfejsa Iterator&lt;&gt;: </p> <ul><li>T next() -&#160; vraća objekat tipa T i postavlja Iterator&lt;T&gt; objekat da pri sledećem pozivu ovog metoda referiše na sledeći objekat kolekcije. Ako nema objekta koji će biti vraćen, izbacuje se izuzetak tipa NoSuchElementException</li></ul> <ul><li>void remove() -&#160;briše poslednji objekat vraćen pozivom metoda next(). Ako next() nije bio pozvan ili ako se pozove remove() dva puta nakon poziva next(), biće izbačen izuzetak tipa IllegalStateException</li></ul> <p>Primer: </p><p> Klasa primerak;</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="k">while</span><span class="p">(</span><span class="n">iterator</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span> <span class="w"> </span><span class="n">primerak</span><span class="o">=</span><span class="n">iterator</span><span class="p">.</span><span class="na">next</span><span class="p">();</span> </pre></div><p>Ovde se podrazumeva da je iterator tipa Iterator&lt;Klasa&gt; i da čuva reference na objekat dobijen iz kolekcije. Jedan objekat koji implementira interfejs Iterator&lt;&gt; je za jednu iteraciju kroz kolekciju. Ukoliko je kasnije potrebno ponovo proći kroz sve elemente kolekcije , neophodno je kreirati novi objekat. </p><div class="mw-heading mw-heading3"><h3 id="List_iteratori">List iteratori</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=9" title="Uredi odjeljak List iteratori" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=9" title="Uredi kôd odjeljka List iteratori"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>U paketu java.util definisan je interfejs ListIterator&lt;&gt;. Deklariše metode koji se koriste za kretanje kroz kolekciju napred i nazad, tako da se do objekta može doći vise nego jednom. ListIterator&lt;&gt; interfejs nasleđuje Iterator&lt;&gt; interfejs. </p><p>Spisak metoda: </p> <ul><li>T next() -&#160; kao kod Iterator&lt;&gt;</li></ul> <ul><li>Boolean hasNext() - kao kod Iterator&lt;&gt;</li></ul> <ul><li>int nextIndex() - vraća indeks objekta koji će biti vraćen pozivom metoda next() kao tip int, ili vraća broj elemenata u listi ako je *ListIterator&lt;&gt; objekat na kraju liste</li></ul> <ul><li>T previous() – vraća prethodni objekat po redosledu u samoj listi. Koristimo ga za vraćanje kroz listu.</li></ul> <ul><li>Boolean hasPrevious() – vraća true ako prethodni poziv previous() vraća objekat.</li></ul> <ul><li>int previousIndex() -&#160;vraća indeks objekta koji će biti vraćen sledećim pozivom metoda previous() ili -1 ako je ListIterator&lt;&gt; objekat na početku liste</li></ul> <ul><li>void remove() -&#160;briše poslednji objekat dobijen pozivom metoda next() ili previous(). Ako next() ili previous() nisu bili pozvani, izbacuje se izuzetak tipa IllegalStateException, a ako operacija brisanja nije podržana za datu kolekciju, izbacuje se izuzetak tipa UnsupportedOperationException</li></ul> <ul><li>void add(T obj) – dodaje argument neposredno pre objekta koji bi bio vraćen sledećem pozivom metoda next() ili iza objekta koji bi bio vraćen sledećim pozivom metoda previous(). Poziv next() nakon dodavanja vraća dodati element, a za previous() se ništa ne menja. Ako objekat ne može da se doda izbavuje se izuzetak tipa UnsupportedOperationException ukoliko postoji neki drugi razlog zbog kojeg dodavanje ne može da se izvrši.</li></ul> <ul><li>void set(T obj) – menja poslednji objekat dobijen pozivom next() ili previous(). I ovaj metod može da izbaci izuzetke tipa UnsupportedOperationException, ClassCastException i IllegalArgumentException.</li></ul> <div class="mw-heading mw-heading2"><h2 id="ArrayList">ArrayList</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=10" title="Uredi odjeljak ArrayList" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=10" title="Uredi kôd odjeljka ArrayList"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>ArrayList&lt;T&gt; definiše kolekciju sa elementima tipa T. Objekat ArrayList&lt;T&gt; radi kao i niz osim što dodatno raste automatski, kada je potreban veći kapacitet. Kao i nizovi, i ArrayList sadrže reference na objekte, ne sam objekte. To je pravilo za sve kolekcije. ArrayList se, za razliku od niza, karakteriše veličinom (size). Kapacitet je maksimalan broj objekata koje ArrayList može da sadrži. Kapacitet je promenljiv, jer se automatski povećava kada se doda novi objekat u već pun vector. Metodom ensureCapacity(int) postavlja se minimalni kapacitet. </p><p> Primer:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">v</span><span class="p">.</span><span class="na">ensureCapacity</span><span class="p">(</span><span class="mi">150</span><span class="p">);</span><span class="w"> </span><span class="cm">/*ako je kapacitet objekta v manji od 150, kapacitet se uvećava na 150. AKo je 150 ili vise neće biti promenjen ovom naredbom.*/</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Konstruktori">Konstruktori</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=11" title="Uredi odjeljak Konstruktori" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=11" title="Uredi kôd odjeljka Konstruktori"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>ArrayList&lt;&gt;() – podrazumevani konstruktor kreira prazan ArrayList&lt;&gt; podrazumevanog kapaciteta 10. Kapacitet se povećava za 50% ukoliko se doda element u već pun ArrayList.</li></ul> <ul><li>ArrayList&lt;String&gt; a= new ArrayList&lt;String&gt;();</li></ul> <ul><li>ArrayList&lt;String&gt; a= new ArrayList&lt;String&gt;(100); - eksplicitno se zadaje kapacitet</li></ul> <div class="mw-heading mw-heading3"><h3 id="Metode">Metode</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=12" title="Uredi odjeljak Metode" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=12" title="Uredi kôd odjeljka Metode"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>size() – vraća broj elemenata koji su smešteni u ArrayList</li></ul> <ul><li>add(T) -&#160; dodaje se objekat iza tekućeg poslednjeg objekta u ArrayList</li></ul> <ul><li>add(int,T) – smešta se objekat na poziciju zadatu prvim argumentum, ostali se pomeraju za jedno mesto u desno.</li></ul> <ul><li>set(int,T) – postavljamo objekat u ArrayList na poziciju zadatu prvim argumentum, briše se objekat koji je prethodno bio na toj poziciji.</li></ul> <ul><li>addAll(lista) – dodaju se svi objekti druge kolekcije u ArrayList</li></ul> <ul><li>addAll(int,lista)</li></ul> <ul><li>get(int) – vraća element na zadatoj poziciji</li></ul><p> Činjenica da se kapacitet ArrayList povećava za 50% svaki put kada se ArrayList popuni utiče na to da se memorija bespotrebno zauzima. Međutim, ovo može da se prevaziđe upotrebom metoda trimToSIze(). Ovaj metod menja kapacitet tako da odgovara trenutnoj veličini.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">names</span><span class="p">.</span><span class="na">trimToSize</span><span class="p">();</span><span class="w"> </span><span class="cm">/*postavlja&#160; kapacitet na trenutnu veličinu. Ako je veličina u trenutku izvršavanja metoda 30 i kapacitet se postavlja na 30. Naravno i dalje se mogu dodavati novi objekti u ArrayList.*/</span> </pre></div><p>Možemo dobiti i ListIterator referencu iz vektora pozivanjem metoda listIterator().</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">ListIterator</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">listIterator</span><span class="p">();</span><span class="w"> </span><span class="cm">/* sada je moguće kretati se u oba smera kroz ArrayList upotrebom metoda iz klase ListIterator. */</span> <span class="n">ListIterator</span><span class="w"> </span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">listIterator</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span><span class="w"> </span><span class="cm">/* ovim se dobija ListIterator objekat koji se odnosi samo na deo ArrayList, pri čemu je argument metoda listIterator() upravo prvi element date sekvence ArrayList. */</span> <span class="n">List</span><span class="w"> </span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="n">list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">subList</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">5</span><span class="p">);</span><span class="w"> </span><span class="cm">/* dobija se podskup objekata iz ArrayList kao kolekcija tipa List&lt;&gt;. Argumetni metoda subList() su početak i kraj sekvence objekata koja čini podskup, pri čemu poslednji element nije uključen. */</span> </pre></div><p>Moguće su i kombinacije: </p><p>ListIterator&lt;String&gt; listIter = names.subList(5,15).listIterator(2); /* subList() vraća podlistu objekata ArrayList od pozicije 5 do pozicije 14 zaključno. Nakon toga se za datu listu poziva metod listIterator() koji vraća list iterator nad elementima liste počevši od elementa sa indeksom 2, pa do kraja. To odgovara elementima polaznog ArrayList sa indeksima od 7 do 14. Ovim iteratorom se kroz datu sekvencu objekata polaznog ArrayList može kretati u oba smera. */ </p><p> Metod toArray() omogućava da se elementi vektora dobiju u obliku običnog niza.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">toArray</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">String</span><span class="o">[</span><span class="n">names</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="o">]</span><span class="p">);</span><span class="w"> </span><span class="cm">/* argument metoda toArray() mora biti niz elemenata istog tipa kao i elementi ArrayList&#160; ili nadtipa. Ako niz nije dovoljne veličine da primi sve elemente ArrayList, kreiraće se novi niz i referenca na taj niz će biti vraćena. Ovde metod toArray() vraća niz String[] koji sadrži sve elemente ArrayList names u odgovarajućem redosledu.*/</span> <span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">people</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="err">“</span><span class="n">Bill</span><span class="err">”</span><span class="p">,</span><span class="w"> </span><span class="err">“</span><span class="n">Barbara</span><span class="err">”</span><span class="p">,</span><span class="w"> </span><span class="err">“</span><span class="n">Brian</span><span class="err">”</span><span class="p">};</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">nameList</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">java</span><span class="p">.</span><span class="na">util</span><span class="p">.</span><span class="na">Arrays</span><span class="p">.</span><span class="na">asList</span><span class="p">(</span><span class="n">people</span><span class="p">);</span> </pre></div><p>Statički parametarski metod asList() definisan u klasi java.util.Arrays konvertuje niz elemenata datog tipa T u List&lt;T&gt; kolekciju. Argument metoda je niz koji se konvertuje i vraća se referenca tipa List&lt;T&gt;. Ova referenca se može proslediti kao argument konstruktoru klase ArrayList:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="p">(</span><span class="n">nameList</span><span class="p">);</span><span class="w"> </span><span class="cm">/* Time se dobija ArrayList koji sadrži elemente datog niza. */</span> </pre></div><p>Brisanje elemenata: </p><ul><li>remove(int) – brisanje reference na objekat na zadatoj poziciji. Vraća se referenca&#160; na uklonjeni objekat, tako da ostaje mogućnost da se sačuva referenca nakon što se ukloni iz ArrayList.</li></ul> <ul><li>remove(T) – brisanje prvog objekta sa zadatom referencom. Ukoliko je pronađen i uklonjen objekat, vraća se true, inače false</li></ul> <ul><li>removeAll(names.subList(2,5)); - brišu se elementi sa indeksima od 2 do 4</li></ul> <ul><li>retailAll(names.subList(2,5)); - ostaju samo elementi sa indeksima od 2 do 4</li></ul> <ul><li>removeAllElements() – uklanja sve elemente iz ArrayList</li></ul> <p>Da li je ArrayList prazan može se utvrditi metodom isEmpty(). Ukoliko je veličina 0, metod vraća true, inače false. Ukoliko ArrayList sadrži samo null elemente, to ne znači da je prazan tj da je veličina 0 ili da će metod isEmpty() vratiti true. Da bi se ispraznio elementi tj reference na objekte moraju biti uklonjene, a ne samo postavljene na null. </p><p>Pretraživanje ArrayList: </p> <ul><li>int indexOf(T) – vraća poziciju datog objekta u ArrayList</li></ul> <ul><li>int indexOf(T,int) – vraća prvu poziciju datog objekta u ArrayList, počevši od pozicije zadate kao drugi argument</li></ul> <p>Za sortiranje elemenata kolekcije najbolje je implementirati interfejs Comparable&lt;&gt;. On deklariše samo jedan metod compareTo() – vraća -1, 0 ili 1 ako je objekat manji, jednak ili veći od argumenta. Ako je Comparable&lt;&gt; interfejs implementiran za tip objekta smešten u kolekciji, možemo samo objekat kolekcije predati kao argument metodu Collections.sort() interfejsa Collections&lt;&gt;. </p> <div class="mw-heading mw-heading2"><h2 id="Povezana_lista_(LinkedList)"><span id="Povezana_lista_.28LinkedList.29"></span>Povezana lista (LinkedList)</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=13" title="Uredi odjeljak Povezana lista (LinkedList)" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=13" title="Uredi kôd odjeljka Povezana lista (LinkedList)"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Konstuktori">Konstuktori</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=14" title="Uredi odjeljak Konstuktori" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=14" title="Uredi kôd odjeljka Konstuktori"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>bez argumenata</li></ul> <ul><li>sa argumentom Collection&lt;&gt; koji kreira LinkedList&lt;&gt; objekat koji sadrži objekte kolekcije koja se prosleđuje kao argument</li></ul> <div class="mw-heading mw-heading3"><h3 id="Metode_2">Metode</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=15" title="Uredi odjeljak Metode" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=15" title="Uredi kôd odjeljka Metode"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>add(),addAll() – kao kod klase Vector&lt;&gt;</li></ul> <ul><li>addFirst() – dodaje objekat na početak liste</li></ul> <ul><li>addLast() – dodaje objekat na kraj liste</li></ul> <ul><li>get(int) – kao kod klase Vector&lt;&gt;</li></ul> <ul><li>getFirst(),getLast()</li></ul> <ul><li>remove(),removeFirst(),removeLast()</li></ul> <ul><li>set()</li></ul> <ul><li>size() – vraća broj elemenata liste</li></ul> <p>Meotdom iterator() dobija se Iterator&lt;&gt; objekat nad listom. Metodom listIterator() objekat ListIterator&lt;&gt;, kao i kod klase Vector&lt;&gt; </p> <div class="mw-heading mw-heading2"><h2 id="Katalozi">Katalozi</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=16" title="Uredi odjeljak Katalozi" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=16" title="Uredi kôd odjeljka Katalozi"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Katalog (HashMap&lt;K,V&gt;) takođe nazivamo i rečnikom. Zajedno se čuvaju i ključ i objekat. Svaki objekat je jedinstveno određen svojim ključem. Svi ključevi, iz tog razloga, moraju da budu različiti. Izdvajanje objekata iz kataloga vrši se pomoću odgovarajućeg ključa, jer ključ određuje gde se u katalogu nalazi objekat. Sve klase za rad sa katalozima implementiraju generički interfejs Map&lt;K,V&gt;. Razmatraćemo generičku klasu HashMap&lt;K,V&gt;.&#160; Implementacija kataloga pomoću generičke klase HashMap&lt;&gt; podrazumeva da su parovi ključ/objekat smešteni u niz. Indeks u nizu dobija se na osnovu ključa za šta se koristi metod hashCode().Ovaj metod nasleđuje se iz klase Object i on proizvodi podrazumevani heškod, osim ako nije predefinisan u nekoj od izvedenih klasa. Stoga, bilo koji objekat može da bude korišćen kao ključ. Na osnovu njega se metodom hashCode() generiše heškod kojim se određuje indeks para sa datim ključem u nizu. </p> <div class="mw-heading mw-heading2"><h2 id="Heširanje"><span id="He.C5.A1iranje"></span>Heširanje</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=17" title="Uredi odjeljak Heširanje" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=17" title="Uredi kôd odjeljka Heširanje"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Ako želimo da kao ključeve koristimo objekte koje sami definišemo, treba da predefinišemo metod equals() iz klase Object. Da bi se obezbedila potrebna funkcionalnost, nova verzija treba da vrati true kada dva različita objekta sadrže iste vrednosti.&#160;Takođe, moguće je predefinisati metod hashCode() tako da raspodela bude prilično uniformna na skupu mogućih vrednosti za ključeve. Jedan način je da se za svaki podatak-članicu klase generiše ceo broj npr. postojećim metodom hashCode() koji se zatim množi prostim brojem (svaki član različitim) i na kraju se dobijeni rezultati sumiraju. Generisanje celog broja za podatak-članicu klase se obično vrši pozivanjem metoda hashCode(). Proste brojeve treba birati tako da ne budu preveliki, kako rezultat ne bi bio van opsega za int. Kad god je podatak-članica klase objekat neke druge klase, a ne primitivnog tipa, neophodno je implementirati hashCode() metod za datu klasu. </p> <div class="mw-heading mw-heading3"><h3 id="Konstuktori_za_HashMap&lt;&gt;"><span id="Konstuktori_za_HashMap.3C.3E"></span>Konstuktori za HashMap&lt;&gt;</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=18" title="Uredi odjeljak Konstuktori za HashMap&lt;&gt;" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=18" title="Uredi kôd odjeljka Konstuktori za HashMap&lt;&gt;"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>HashMap() – podrazumevani, kreira katalog podrazumevanog kapaciteta 16, a podrazumevani load faktor je 0.75</li></ul> <ul><li>HashMap(int capacity) – kreira katalog datog kapaciteta, sa podrazumevanim load faktorom</li></ul> <ul><li>HashMap(int capacity, float loadFactor) – kreira katalog sa datim kapacitetom i load faktorom</li></ul> <ul><li>četvri konstuktor kreira katalog na osnovu postojećeg kataloga</li></ul> <p>Kapacitet kataloga je broj parova ključ/objekat koji mogu da se čuvaju. Automatski se povećava, ako je neophodno.&#160; Poželjno je da se za kapacitet kataloga zadaje prost broj, kako bi se izbegla kolizija. Faktor punjenja (load faktor) se koristi za odlučivanje kada kapacitet heš tabele treba da se poveća . Kada veličina tabele dostigne vrednost proizvoda faktora punjenja i kapaciteta, kapacitet se automatski povećava dva puta uz dodavanje 1 da bi se osiguralo da je novi kapacitet barem neparan, ako već nije prost. </p><p>Smeštanje, dobijanje i uklanjanje objekata kataloga: </p> <ul><li>V put(K key, V value) – smešta objekat value u katalog koristeći ključ key.</li></ul> <ul><li>V remove(Object key) – uklanja par povezan sa ključem ako postoji i vraća referencu na objekat. Ukoliko ne postoji odgovarajući par sa datim ključem, ili je objekat pridružen ključu null, vraća se null.</li></ul> <ul><li>V get(Object key) – vraća objekat sa istim ključem kao key. Objekat ostaje u katalogu. Ako nema nijednog objekta sa datim ključem, ili je null smešteno umesto objekta, vraća se null</li></ul> <p>Ako get() vrati null, ne znamo da li objekat povezan sa ključem ne postoji ili je objekat null. Za ovo služi metod containsKey() koji kao argument ima dati ključ. On vraća true ako je ključ smešten u katalogu. </p><p>Map&lt;&gt; interfejs obezbeđuje 3 načina za dobijanje kolekcionog pregleda sadržaja kataloga: </p> <ul><li>keySet() – vraća Set objekat koji referiše na ključeve kataloga</li></ul> <ul><li>entrySet() – vraća Set&lt;Map.Entry&gt; objekat koji referiše na parove ključ/objekat – svaki par je objekat tipa Map.Entry. Entry je generički interfejsni tip definisan unutar interfejsa Map&lt;&gt;.</li></ul> <ul><li>values() – vraća Collection objekat koji referiše na objekte iz kataloga.</li></ul> <div class="mw-heading mw-heading2"><h2 id="Generičke_klase"><span id="Generi.C4.8Dke_klase"></span>Generičke klase</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=19" title="Uredi odjeljak Generičke klase" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=19" title="Uredi kôd odjeljka Generičke klase"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Na isti način, kao što se definišu generičke funkcije, mogu se definisati I generičke klase. Definicija članova klase se provodi pomoću generičkog tipa. Na primer</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">array</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="p">...</span> <span class="p">}</span> </pre></div><p>pomoću koje se može realizovati nizovi proizvoljnog tipa. Na primer deklaracijom</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">myints</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div><p>se formira niz od 5 celobrojnih elemenata, a sa</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">mystrings</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div><p>se formira niz od 5 stringova.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">array</span><span class="p">{</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">*</span><span class="n">m_pbuff</span><span class="p">;</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="kd">public</span><span class="p">:</span> <span class="w"> </span><span class="n">array</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">):</span><span class="w"> </span> <span class="w"> </span><span class="n">m_size</span><span class="p">(</span><span class="n">N</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">m_pbuff</span><span class="o">=</span><span class="k">new</span><span class="w"> </span><span class="n">T</span><span class="o">[</span><span class="n">N</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="o">~</span><span class="n">array</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">delete</span><span class="w"> </span><span class="o">[]</span> <span class="w"> </span><span class="n">m_pbuff</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">size</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">set</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">value</span><span class="p">);</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">);</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> <span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">::</span><span class="n">set</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">value</span><span class="p">){</span> <span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">x</span><span class="o">]=</span><span class="n">value</span><span class="p">;</span> <span class="p">}</span> <span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">::</span><span class="n">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">x</span><span class="o">]</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Get() i set() funkcije smo mogli definisati inline unutar definicije klase. One su definisane izvan klase kako bi se pokazalo da se tada uvek ispred definicije funkcije mora napisati generički prefiks: template &lt;class T&gt;.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">myints</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">myfloats</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="w"> </span><span class="n">myints</span><span class="p">.</span><span class="na">set</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">);</span> <span class="w"> </span><span class="n">myfloats</span><span class="p">.</span><span class="na">set</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mf">3.1416</span><span class="p">);</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;myints ima: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myints</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot; elemenata&quot;</span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myints</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myfloats</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Rezultat je: </p><p>myints ima: 5 elemenata </p><p>100 </p><p>3.1416 </p><p>Elementima niza se pristupa pomoću set/get funkcija ili pomoću indeksne notacije. </p><p>Primer: </p><p> Klasa pair služi kao kontenjer dva elementa koji mogu biti različitih tipova. Formiraćemo niz takvih parova pomoću generičke klase array. U taj niz ćemo upisati i iz njega ispisati niz parova kojima prvi element predstavlja redni broj (tip int), a drugi element je kvadratni koren prvoga (tip float).</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T1</span><span class="p">,</span><span class="w"> </span><span class="kd">class</span> <span class="nc">T2</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">pair</span><span class="p">{</span> <span class="w"> </span><span class="n">T1</span><span class="w"> </span><span class="n">value1</span><span class="p">;</span> <span class="w"> </span><span class="n">T2</span><span class="w"> </span><span class="n">value2</span><span class="p">;</span> <span class="w"> </span><span class="kd">public</span><span class="p">:</span> <span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">(</span><span class="n">T1</span><span class="w"> </span><span class="n">first</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">T2</span><span class="w"> </span><span class="n">second</span><span class="o">=</span><span class="mi">0</span><span class="p">){</span> <span class="w"> </span><span class="n">value1</span><span class="o">=</span><span class="n">first</span><span class="p">;</span> <span class="w"> </span><span class="n">value2</span><span class="o">=</span><span class="n">second</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">T1</span><span class="w"> </span><span class="nf">GetFirst</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="k">return</span><span class="w"> </span><span class="n">value1</span><span class="p">;}</span> <span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">SetFirst</span><span class="w"> </span><span class="p">(</span><span class="n">T1</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">value1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">T2</span><span class="w"> </span><span class="nf">GetSecond</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">value2</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">SetSecond</span><span class="w"> </span><span class="p">(</span><span class="n">T2</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">value2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="p">};</span> <span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">(){</span> <span class="w"> </span> <span class="c1">// niz od 5 parova int,float</span> <span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">arr</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="w"> </span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">SetFirst</span><span class="p">(</span><span class="n">i</span><span class="p">);</span><span class="c1">//prvi sadrži redni broj</span> <span class="w"> </span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">SetSecond</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">i</span><span class="p">));</span><span class="c1">//kvadratni koren prvog</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">arr</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">GetFirst</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="sc">&#39;:&#39;</span> <span class="w"> </span><span class="o">&lt;&lt;</span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">GetSecond</span><span class="p">()</span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Rezultat je:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="mi">0</span><span class="p">:</span><span class="mi">0</span> <span class="mi">1</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2</span><span class="p">:</span><span class="mf">1.41421</span> <span class="mi">3</span><span class="p">:</span><span class="mf">1.73205</span> <span class="mi">4</span><span class="p">:</span><span class="mi">2</span> </pre></div><p>Važno je upozoriti na oblik deklaracije niza parova:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div> <ol><li>Vidimo da se konkretna realizacija generičkog tipa može izvršiti i pomoću drugih generičkih tipova.</li> <li>U deklaraciji se pojavljuju dva znaka &gt; &gt;. Između njih obvezno treba napisati razmak, jer ako bi napisali<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="nf">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span><span class="w"> </span><span class="c1">// greška&#160;: &gt;&gt;</span> </pre></div>kompajler bi prijavio grešku zbog toga jer se znak &gt;&gt; tretira kao operator.</li></ol><p> Da bi se izbegle ovakove greške, preporučuje se korišćenje&#160; typedef deklaracije oblika:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">typedef</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="n">if_pair</span><span class="p">;</span> <span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">if_pair</span><span class="o">&gt;</span><span class="w">&#160; </span><span class="nf">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Specijalizacija_šablona"><span id="Specijalizacija_.C5.A1ablona"></span>Specijalizacija šablona</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=20" title="Uredi odjeljak Specijalizacija šablona" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=20" title="Uredi kôd odjeljka Specijalizacija šablona"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Standardna_biblioteka_%C5%A1ablona" title="Standardna biblioteka šablona">Standardna biblioteka šablona</a><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">&#91;</span>4<span class="cite-bracket">&#93;</span></a></sup> je softverksa bibliotea programskog jezika C++ koja je delimično uključena u S++ standardnu biblioteku. Obezbeđuje četiri kopmonente: kontejnere, iteratore, algoritme i&#160; funktore. STL obezbeđuje gotov skup osnovnih klasa za C++ kao što su kontejneri i asocijativni nizovi,&#160; koji se može koristiti uz bilo koji ugrađeni tip i uz bilo koji korisnički definisan tip koji podržava neke osnovne operacije (kao što su kopiranje i dodela). STL algoritmi su nezavisni od kotejnera, što značajno smanjuje kompleksnost biblioteke. STL ostvaruje rezultate kroz upotrebu šablona. Ovaj pristup obezbeđuje polimorfizam vremena kompajliranja koji je često efikasniji od tradicionalnog polimorfizma vremena pokretanja. Moderni C++ prevodioci podešeni su tako da minimalizuju bilo kakvu kaznz apstrakcije nastalu intezivnom upotrebom STL-a. STL je nastao kao prva biblioteka generičkih algoritama i struktura podataka za C++, sa četiri ideje na umu: generičko programiranje, apstrakcija bez gubitka efikasnosti, fon Nojmanova arhitektura i vrednosna semantika. </p><p>Ponekad se s jednim šablonom ne mogu obuhvatiti svi slučajevi realizacije s različitim tipovima. U tom slučaju, za tipove kojima realizacija odstupa od šablona, može definisati poseban slučaj realizacije koji nazivamo specijalizacija šablona. </p><p> Za klasu koju definišemo šablonon:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">gen_tip</span><span class="o">&gt;</span><span class="w"> </span><span class="n">identifikator</span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>Specijalizacija za konkretan tip se zapisuje u obliku:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;&gt;</span><span class="kd">class</span> <span class="nc">identifikator</span><span class="o">&lt;</span><span class="n">konkretan_tip</span><span class="o">&gt;</span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>Specijalizacija se smatra delom šablona, stoga njena deklaracija započinje sa tamplate&lt;&gt;. U njoj se moraju definisati svi članovi šablčona, ali isključivo sa konkretnim tipovima za koje se vrši specijalizacija šablona. Podrazumeva se da moraju biti definisani konstruktor i destruktor, ukoliko su definisani u opštem šablonu. </p><div class="mw-heading mw-heading2"><h2 id="Šabloni_sa_konstantnim_parametrima"><span id=".C5.A0abloni_sa_konstantnim_parametrima"></span>Šabloni sa konstantnim parametrima</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=21" title="Uredi odjeljak Šabloni sa konstantnim parametrima" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=21" title="Uredi kôd odjeljka Šabloni sa konstantnim parametrima"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Parametri šablona mogu biti i integralne konstante (int,char,long, unsigned). Na primer,</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="o">&gt;</span><span class="w">&#160; </span><span class="kd">class</span> <span class="nc">array</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="p">...</span> <span class="p">}</span> </pre></div><p>je šablon za definiranje klase array pomoću generičkog tipa T i integralne konstante N. Vrednost integralne konstante se mora specificirati pri deklaraciji objekta. Na primer, </p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">float</span><span class="p">,</span><span class="mi">5</span><span class="o">&gt;</span><span class="w"> </span><span class="n">myfloats</span><span class="p">;</span> </pre></div><p>deklariše se myfloat kao niz realnih brojeva kojem se dodatna svojstva zadaju s konstantom N=5. U sledećem primeru koristićemo ovaj konstantni parametar za postavljanje veličine niza.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="o">&gt;</span> <span class="kd">class</span> <span class="nc">array</span><span class="p">{</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">m_buff</span><span class="o">[</span><span class="n">N</span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od N elemenata</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="kd">public</span><span class="p">:</span> <span class="w"> </span><span class="n">array</span><span class="p">()</span><span class="w">&#160;</span><span class="p">:</span><span class="w"> </span><span class="n">m_size</span><span class="p">(</span><span class="n">N</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">size</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_buff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="kd">const</span><span class="p">{</span><span class="w"> </span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_buff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="p">};</span> <span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="mi">5</span><span class="o">&gt;</span><span class="w"> </span><span class="n">myints</span><span class="p">;</span> <span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="kt">float</span><span class="p">,</span><span class="mi">5</span><span class="o">&gt;</span><span class="w"> </span><span class="n">myfloats</span><span class="p">;</span> <span class="w"> </span><span class="n">myints</span><span class="o">[</span><span class="mi">0</span><span class="o">]=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span> <span class="w"> </span><span class="n">myfloats</span><span class="o">[</span><span class="mi">3</span><span class="o">]=</span><span class="w"> </span><span class="mf">3.1416</span><span class="p">;</span><span class="w"> </span><span class="mi">13</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;myints ima: &quot;</span><span class="o">&lt;&lt;</span><span class="n">myints</span><span class="p">.</span><span class="na">size</span><span class="p">()</span> <span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot; elemenata&quot;</span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myints</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myfloats</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Dobije se ispis:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="mi">100</span> <span class="mf">3.1416</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Predodređeni_i_funkcijski_parametri_šablona"><span id="Predodre.C4.91eni_i_funkcijski_parametri_.C5.A1ablona"></span>Predodređeni i funkcijski parametri šablona</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=22" title="Uredi odjeljak Predodređeni i funkcijski parametri šablona" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=22" title="Uredi kôd odjeljka Predodređeni i funkcijski parametri šablona"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> U šablonima se mogu koristiti predodređeni parametri. Na primer, šablonom</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">=</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="o">=</span><span class="mi">10</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">array</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>se omogućuju deklaracije oblika:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="n">a_int_10</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od 10 int</span> <span class="n">array</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="n">a_float_10</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od 10 float</span> <span class="n">array</span><span class="o">&lt;</span><span class="kt">char</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="o">&gt;</span><span class="w"> </span><span class="n">a_char_100</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od 100 char</span> </pre></div><p><i>Napomena:</i> predodređeni parametri se ne smeju koristiti u funkcijskim šablonima Parametri šablona mogu biti funkcije:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="w"> </span><span class="nf">Tfunc</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="o">&gt;</span> <span class="kd">class</span> <span class="nc">X</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="p">...</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Tfunc</span><span class="p">(</span><span class="n">x</span><span class="p">);</span><span class="w"> </span><span class="o">!!!</span> <span class="w"> </span><span class="p">...</span> <span class="p">}</span> </pre></div><p>Moramo paziti da uzimamo što manje pretpostavki na tipove koji su parametri šablona. Preporučuje se: parametri generičkih funkcija su const reference (da bismo izbegli zahtev da se objekti moraju kopirati, da postoji i da je dobro definisan copz konstruktor), za upoređivanje koristimo samo operator &lt; (ne i operator &gt;, operator &gt;=, itd)</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span> <span class="n">T</span><span class="w"> </span><span class="nf">min</span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="n">b</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">a</span><span class="w">&#160;</span><span class="p">:</span><span class="w"> </span><span class="n">b</span><span class="p">;</span> <span class="p">}</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Poređenje_šablona_i_makro_naredbi"><span id="Pore.C4.91enje_.C5.A1ablona_i_makro_naredbi"></span>Poređenje šablona i makro naredbi</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=23" title="Uredi odjeljak Poređenje šablona i makro naredbi" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=23" title="Uredi kôd odjeljka Poređenje šablona i makro naredbi"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Šablone možemo smatrati integralnim makro naredbama. Primena šablona ima nekoliko prednosti u odnosu na makro naredbe: </p> <ol><li>Lakše ih je shvatiti jer šabloni izgledaju kao regularne klase(ili funkcije)</li> <li>U razvoju šablona lakše se prevodi testiranje s različitim tipovima</li> <li>Kompajler osigurava znatno veću kontrolu grešala nego je to slučaj s makro naredbama</li> <li>Funkcijski šabloni imaju definisan doseg, jer se mogu definisati kao deo klase (friend) ili namespace</li> <li>Funkcijski šabloni mogu biti rekurzivni</li> <li>Funkcijski šabloni se mogu preopteretiti</li> <li>Pri komplajliranju neke datoteke, kompajler mora raspolagati s potpunom implementacijom šablona. Stoga je uobičajeno da se specifikacija i implementacija funkcija zapisuje u istoj „.h“ datoteci. Makro karakter šablona se posebno očitava kod klasa koje imaju statičke članove. U tom slučaju se za svaku realizaciju šablona inicira posebno statička promenljiva (kod regularnih se klasa za sve objekte jedne klase generiše samo jedna statička promenljiva)</li></ol> <div class="mw-heading mw-heading2"><h2 id="Definicija_i_upotreba_klase_tvector&lt;class_T&gt;"><span id="Definicija_i_upotreba_klase_tvector.3Cclass_T.3E"></span>Definicija i upotreba klase tvector&lt;class T&gt;</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=24" title="Uredi odjeljak Definicija i upotreba klase tvector&lt;class T&gt;" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=24" title="Uredi kôd odjeljka Definicija i upotreba klase tvector&lt;class T&gt;"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Generička klasa tvector predstavlja podskup standatdne klase vector. Namenjeno joj je manipulisanje s homogenim kolekcijama elemenata proizvoljnog tipa. Izvršičemo specifikaciju i implementa klase tvector temeljem znanja koja smo stekli razmatrajući generičku klasu array i klasu Tstring. </p><p>Objekti tvector klasse imaju sledeće karakteristike: </p> <ul><li>capacity() – kapacitet vektor je broj ćelija koje se automatski alociraju za spremanje elemenata vektora</li> <li>size() – veličina vektora je broj elemenata koje stvarno sadrži vektor</li> <li>resize(n) – ako je potreban veći kapacitet vektora, on se može dobiti pozivom funkcije resize(n)</li> <li>operator [] – pojedinom elementu vektora se pristupa pomoću indeksnog operatora, ili se koriste dve funkcije: <ul><li>push_back(el) dodaje element na indeksu iza poslednje upisanog elementa</li> <li>pop_back(el) briše poslednji element iz vektora</li></ul></li></ul> <p>Pri pozivu push_back() funkcije vodi se računa o kapacitetu vektora i vrši se automatsko alociranje potrebne memorije (memorija se udvostručuje ako potrebna veličina vektora premašuje trenutni kapacitet). Namena ove dve funkcije je da se vektor može koristiti kao dinamička kolekcija elemenata (kontejner). </p> <div class="mw-heading mw-heading2"><h2 id="Reference">Reference</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=25" title="Uredi odjeljak Reference" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=25" title="Uredi kôd odjeljka Reference"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <style data-mw-deduplicate="TemplateStyles:r41556849">.mw-parser-output .reflist{font-size:90%;margin-bottom:0.5em;list-style-type:decimal}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}</style><div class="reflist"> <div class="mw-references-wrap"><ol class="references"> <li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><span class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20161220085102/http://marjan.fesb.hr/~mateljan/cpp/slides12-templates.pdf">„Generičke funkcije i klase – template (predlošci)”</a>.&#32;Arhivirano&#32;iz <a rel="nofollow" class="external text" href="http://marjan.fesb.hr/~mateljan/cpp/slides12-templates.pdf">originala</a>&#32;na datum 2016-12-20<span class="reference-accessdate">.&#32;Pristupljeno 2019-01-17</span>.</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=bookitem&amp;rft.btitle=Generi%C4%8Dke+funkcije+i+klase+%E2%80%93+template+%28predlo%C5%A1ci%29&amp;rft.atitle=&amp;rft_id=https%3A%2F%2Fweb.archive.org%2Fweb%2F20161220085102%2Fhttp%3A%2F%2Fmarjan.fesb.hr%2F%7Emateljan%2Fcpp%2Fslides12-templates.pdf&amp;rfr_id=info:sid/en.wikipedia.org:Generi%C4%8Dko_programiranje"><span style="display: none;">&#160;</span></span></span> </li> <li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.ftn.kg.ac.rs/publikacije/IT/3%20linkovi%20i%20prilozi/_private/Programski%20jezici/Ostale%20strane/IZDVAJAMO%20IZ%20SADRZAJA.htm#Generički+mehanizam+(šabloni)">Generički mehanizam</a></span> </li> <li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><span class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20161220135125/http://poincare.matf.bg.ac.rs/~stasa/OOP/Cas%2009.pdf">„Generički klasni tipovi”</a>.&#32;Arhivirano&#32;iz <a rel="nofollow" class="external text" href="http://poincare.matf.bg.ac.rs/~stasa/OOP/Cas%2009.pdf">originala</a>&#32;na datum 2016-12-20<span class="reference-accessdate">.&#32;Pristupljeno 2019-01-17</span>.</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=bookitem&amp;rft.btitle=Generi%C4%8Dki+klasni+tipovi&amp;rft.atitle=&amp;rft_id=https%3A%2F%2Fweb.archive.org%2Fweb%2F20161220135125%2Fhttp%3A%2F%2Fpoincare.matf.bg.ac.rs%2F%7Estasa%2FOOP%2FCas%252009.pdf&amp;rfr_id=info:sid/en.wikipedia.org:Generi%C4%8Dko_programiranje"><span style="display: none;">&#160;</span></span></span> </li> <li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><a class="external text" href="https://sr.wikipedia.org/sr-el/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D0%B4%D0%BD%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0">Standardna biblioteka šablona</a></span> </li> </ol></div></div> <p>U računarstvu, <b>generičko programiranje</b> je tehnika koja dozvoljava da jedna promenljiva može da čuva različite <a href="/w/index.php?title=Tipovi_podataka&amp;action=edit&amp;redlink=1" class="new" title="Tipovi podataka (stranica ne postoji)">tipove podataka</a> (takozvana višeobličnost ili polimorfizam) sve dok su zadovoljeni određeni uslovi kao što su podklasa i pravilna deklaracija. Dakle, dozvoljava nam stvaranje <a href="/wiki/Funkcija_(programiranje)" title="Funkcija (programiranje)">funkcija</a>&#160;i klasa koje ne zavise od tipa. Primer: STL vektor, lista, stek itd. Na primer, ako se želi napraviti <a href="/w/index.php?title=Povezana_lista&amp;action=edit&amp;redlink=1" class="new" title="Povezana lista (stranica ne postoji)">lista</a> koristeći generičnost, moguća deklaracija bi bila List &lt;T&gt;, gde T predstavlja vrstu podataka. Kada se načini primerak može se napraviti List&lt;Integer&gt; ili List&lt;Animal&gt;. Prema listi se zatim postupa kao prema listi onog tipa podataka koji je naveden. Od objektno orijentisanih programskih jezika, programski jezici <a href="/wiki/C%2B%2B" title="C++">C++</a>, D, <a href="/w/index.php?title=BETA_(programming_language)&amp;action=edit&amp;redlink=1" class="new" title="BETA (programming language) (stranica ne postoji)">BETA</a>, <a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;redlink=1" class="new" title="Eiffel (programming language) (stranica ne postoji)">Eiffel</a>, <a href="/w/index.php?title=Ada_(programming_language)&amp;action=edit&amp;redlink=1" class="new" title="Ada (programming language) (stranica ne postoji)">Ada</a> i neke verzije <a href="/wiki/Java_(programski_jezik)" title="Java (programski jezik)">Jave</a> (1.5 i novije) podržavaju generičke tipove podataka. <a href="/w/index.php?title=Visual_Basic_.NET&amp;action=edit&amp;redlink=1" class="new" title="Visual Basic .NET (stranica ne postoji)">VB.NET</a> i <a href="/wiki/C_Sharp" title="C Sharp">C#</a> su počeli da podržavaju generičke tipove od verzije .NET 2.0. Šabloni – osnova za generičko programiranje:&#160; šablon je ustvari formula ili recept za stvaranje klase ili funkcije. Postoje funkcijski šabloni i šabloni klase. </p> <div class="mw-heading mw-heading2"><h2 id="Generičke_funkcije_i_klase_–_template[1]_2"><span id="Generi.C4.8Dke_funkcije_i_klase_.E2.80.93_template.5B1.5D_2"></span>Generičke funkcije i klase – template<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">&#91;</span>1<span class="cite-bracket">&#93;</span></a></sup></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=26" title="Uredi odjeljak Generičke funkcije i klase – template[1]" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=26" title="Uredi kôd odjeljka Generičke funkcije i klase – template[1]"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Pod pojmom generičkog programiranja podrazumeva se izrada programskog koda koji se u nepromenjenom obliku može primeniti na različite tipove podataka. </p><p> U C jeziku se za generičko programiranje koriste predprocesorske makro naredbe, npr:</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#define Kvadrat(x) x*x</span> </pre></div><p>Ovo je makro naredba kojom se deo koda koji je u zagradama označen sa x zamenjuje sa x*x. Makro naredbe nisu funkcije. One se realizuju u toku kompajliranja leksičkom zamenom teksta. </p><p>Primer: </p> <table class="wikitable"> <tbody><tr> <th>Makro naredba: </th> <th>Izvršava se kao: </th></tr> <tr> <td>int i; <p>Kvadrat(i) * 3 </p> </td> <td>int i; <p>i*i*3 </p> </td></tr> <tr> <td>float x; <p>x*Kvadrat(6.7) </p> </td> <td>float x; <p>x*6.7*6.7 </p> </td></tr> <tr> <td>float x; <p>x=Kvadrat(x+6.7) </p> </td> <td>float x; <p>x=x+6.7*x+6.7 </p><p>//greška </p> </td></tr></tbody></table><p> U prva dva primera pokazano je kako se ista makro naredba koristi za tipove int i float. Greška u trećem primeru, se može izbeći tako da se „argumenti“ makro naredbe napišu u zagradama tj.</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#define Kvadrat(x) (x)*(x)</span> </pre></div><p>Problem kod makroa je da je kod makroa nepregledan i teško je uočiti compile – greške, budući da kompajler samo kod makroa nalepi umesto poziva i moguće su semantičke greške koje je vrlo teško otkriti </p><p>To je jedan od razloga zbog kojeg u C++-u imamo generičke (template) funkcije (funkcijske šablone). C++ je strogo tipizirani jezik, tj pri definiciji funkcije moramo navesti tipove parametara. C++ dopušta korišćenje preopterećenih (overloaded) funkcija. To su funkcije koje imaju jednaka imena (i pripadaju istom dosegu – namespaceu) ali različitu listu parametara. Preopterećivanje funkcije ima nekoliko nedostataka: ukoliko želimo nešto promeniti u kodu funkcije moramo to učiniti na puno mesta, pa se povećava i mogućnost greške, ne možemo predvideti na kojim će sve tipovima korisnik hteti da pozove funkciju. </p><p> U C++ se isti efekat kao u C-u sa #define može postići korišćenjem definisanjem inline funkcija:</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">inline</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> <span class="kr">inline</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> <span class="kr">inline</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p><i>Preporuka:</i> bolje je da se koriste inline funkcije nego makro naredbe, jer se time osigurava bolja kontrola tipova i izbegava mogućnost pojave prethodno opisane greške. Primetimo da sva tri tipa definicije funkcije Kvadrat imaju isti oblik:</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="n">T</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>gde T može biti <i>int</i>, <i>float</i> ili <i>double</i>. Ova definicija ima generički oblik. U C++ jeziku se može vršiti generičko definisanje funkcija, na način da se ispred definicije ili deklaracije funkcije, pomoću ključne reči template, označi da T predstavlja „generički tip“.</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">Kvadrat</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>ili</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="n">typename</span><span class="w"> </span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Razlika u ova dva zapisa je u upotrebi ključne reči class ili typename, ali značenje je potpuno isto. Izvršenje poziva funkcije se mora obaviti sa stvarnim tipovima:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">;</span> <span class="n">y</span><span class="o">=</span><span class="n">Kvadrat</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="n">x</span><span class="p">);</span> </pre></div> <p>Pogodno je da se klase i funkcije mogu pisati generički, parametrizovano tipovima podataka. Takve generičke klase i funkcije nazivaju se u jeziku C++&#160; šablonima (templates). Iz šablona se generišu stvarne klase, odnosno funkcije, za konkretne tipove. Generički mehanizam<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">&#91;</span>2<span class="cite-bracket">&#93;</span></a></sup> je u potpunosti statički&#160;-substitucija parametara je u vreme&#160;prevođenja. Funkcijski šablon se ne koristi dok kompajler ne naiđe na poziv generičke funkcije. Tek tada se stvara i prevodi nova varijanta funkcije u zavisnosti o tipu na kojem je funkcija pozvana. Taj proces stvaranja nove konkretne varijante funkcije iz funkcijskog šablona naziva se instancijacija. Tipovi se kod funkcijskih šablona prepoznaju automatski. Zbog toga se i definicija i implementacija takvih funkcija piše u .h datoteku. Kompajler tek u trenutku poziva funkcije može odrediti način kako se prevodi generička funkcija, stoga su generičke funkcije po upotrebi&#160; ekvivalentne makro naredbama. Da bi se moglo izvršiti kompajliranje programa u kojem se koristi generička funkcija, kompajleru mora biti na raspolaganju potpuna definicija funkcije, a ne samo deklaracija funkcije kao što je slučaj kod upotrebe regularnih funkcija. </p><p> Generički tip T se može koristiti unutar funkcije za oznaku tipa lokalne promenljive:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="nf">Kvadrat</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">x</span><span class="p">){</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">result</span><span class="o">=</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">result</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="n">k</span><span class="p">;</span><span class="w"> </span> <span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mf">10.9</span><span class="p">,</span><span class="n">b</span><span class="p">;</span> <span class="w"> </span><span class="n">k</span><span class="o">=</span><span class="n">Kvadrat</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="n">i</span><span class="p">);</span><span class="w"> </span> <span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="n">Kvadrat</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="n">k</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="n">b</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="mi">25</span> <span class="mf">118.81</span> </pre></div><p>Ne mora se uvek, pri pozivu funkcije, specificirati generički tip ako se iz tipova argumenata nedvosmisleno može zaključiti koji se parametarski tip koristi.</p><div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="n">k</span><span class="p">;</span> <span class="kt">float</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mf">10.9</span><span class="p">,</span><span class="n">b</span><span class="p">;</span> <span class="n">k</span><span class="o">=</span><span class="n">Kvadrat</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> <span class="n">b</span><span class="o">=</span><span class="n">Kvadrat</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="n">k</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="n">cout</span><span class="o">&lt;&lt;</span><span class="n">b</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> </pre></div><p>Preporuka je ipak, da se uvek eksplicitno specifira parametarski tip. Mogu se definisati generičke funkcije sa više generičkih tipova. Primer:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="kd">class</span> <span class="nc">U</span><span class="o">&gt;</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="nf">GetMin</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="n">b</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="o">&lt;</span><span class="n">b</span><span class="o">?</span><span class="n">a</span><span class="p">:</span><span class="n">b</span><span class="p">);</span> <span class="p">}</span> </pre></div><p>definiše funkciju sa dva argumenata kojima se pridružuju generički tipovi T i U. Moguće je izvršiti poziv funkcije na sledeći način: ili još jednostavnije</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">i</span><span class="o">=</span><span class="n">GetMin</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="p">,</span><span class="n">l</span><span class="p">);</span> </pre></div><p>Iako su j i l različitog tipa, kompajler sam vrši konverzije integralnih tipova. </p><div class="mw-heading mw-heading2"><h2 id="Generički_klasni_tipovi[3]_2"><span id="Generi.C4.8Dki_klasni_tipovi.5B3.5D_2"></span>Generički klasni tipovi<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">&#91;</span>3<span class="cite-bracket">&#93;</span></a></sup></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=27" title="Uredi odjeljak Generički klasni tipovi[3]" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=27" title="Uredi kôd odjeljka Generički klasni tipovi[3]"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Pretpostavimo da radimo sa nekim skupom objekata koje želimo da nekako organizujemo. U tom slučaju koriste se klase koje se označavaju kao kolekcije (kolekcija=zbirka, skupljanje). One definišu objekte koji se koriste za organizaciju drugih objekata odgovarajućeg tipa u kolekcije na odgovarajući način. Moguće je u kolekciju dodavati objekte različitog tipa, ali onda imamo problem utvrđivanja tipa objekta prilikom njegovog korišćenja. Ako pokušamo da neki objekat iz ove kolekcije upotrebimo kao objekat neke druge klase, nailazimo na problem. Npr. neka smo omogućili da kolekciji mogu da se dodaju objekti klasa Tacka, Duz i String. Ako, primera radi, pokušamo da upotrebimo neki objekat klase Duz ili String kao objekat klase Tacka, program neće biti preveden. Da bi se izbegli ovakvi problemi, treba definisati kolekciju tako da se onemogući slučajno dodavanje objekta pogrešnog tipa. Jedan način za rešenje ovog problema je definisati zasebne kolekcije koje mogu da sadrže samo objekte jednog tipa. Ali onda se javlja drugi problem – imaćemo za svaki tip objekta po jednu klasu koja definiše odgovarajuću kolekciju. Drugi, efikasniji način, su upravo generički tipovi. Oni omogućuju da se definiše samo jedna klasa kojom je kolekcija predstavljena. Svi objekti u kolekciji su istog tipa, ali sada postoji mogućnost da taj tip može biti proizvoljan.&#160;Na ovaj način, imamo jednu kolekciju koja može da se ponaša i kao kolekcija tačaka, i kao kolekcija duži i kao kolekcija stringova itd. Generički tip je klasni ili interfejsni tip koji ima jedan ili više parametara. Definicija konkretne klase ili interfejsa iz generičkog tipa vrši se dodavanjem konkretnog argumenta za svaki od parametara generičkog tipa.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">LinkedList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>Parametar T se upotrebljava u definiciji metoda i polja gde postoji zavisnost od tipa ovog argumenta. Pojave ovog parametra u definiciji generičkog tipa se označavaju kao promenljive tipa, jer&#160; će biti zamenjene konkretnom vrednošću tog tipa, na isti način kao što parametri metoda bivaju zamenjeni argumentum koji se prosledi metodu. Kreiranje klase iz datog generičkog tipa vrši se navođenjem odgovarajućeg argumenta za parameter unutar &lt;&gt;. Sva pojavljivanja parametra T u definiciji generičkog tipa biće zamenjena datim argumentum. Generički tip na taj način definiše skup tipova, dobijenih za različite vrednosti parametra tipa T. Kao argument za parameter T može se proslediti samo klasni ili interfejsni tip. Primitivni tipovi&#160;ne mogu da se koriste. Umesto njih koristimo odgovarajuće klase koje ih enkapsuliraju. Generički tip LinkedList&lt;T&gt; koji čuva double vrednosti:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;</span><span class="w"> </span><span class="n">temp</span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;</span><span class="p">();</span> <span class="n">temp</span><span class="p">.</span><span class="na">addItem</span><span class="p">(</span><span class="mf">10.8</span><span class="p">)</span> </pre></div><p>Pošto je tip parametra Double kompajler automatski umeće konverziju vrednosti 10.8 iz double u Double. Možemo da definišemo generički tip koji definiše skup klasa koje obuhvataju par objekata proizvoljnog tipa. U tom slučaju definišemo generički tip sa dva parametra:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Par</span><span class="w"> </span><span class="o">&lt;</span><span class="n">TipKljuca</span><span class="p">,</span><span class="w"> </span><span class="n">TipVrednosti</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="nf">Par</span><span class="p">(</span><span class="n">TipKljuca</span><span class="w"> </span><span class="n">kljuc</span><span class="p">,</span><span class="w"> </span><span class="n">TipVrednosti</span><span class="w"> </span><span class="n">vr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">kljuc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">kljuc</span><span class="p">;</span> <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">vr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">vr</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="err">…</span> <span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">TipKljuca</span><span class="w"> </span><span class="n">kljuc</span><span class="p">;</span> <span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">TipVrednosti</span><span class="w"> </span><span class="n">vr</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Upotreba:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">Par</span><span class="w"> </span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="n">String</span><span class="o">&gt;</span><span class="n">unos</span><span class="w"> </span><span class="o">=</span><span class="k">new</span><span class="w"> </span><span class="n">Par</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="n">String</span><span class="o">&gt;</span><span class="p">(</span><span class="err">“</span><span class="n">Milan</span><span class="err">”</span><span class="p">,</span><span class="w"> </span><span class="err">“</span><span class="mi">4445555</span><span class="err">”</span><span class="p">);</span> </pre></div><p>Oblast važenja parametarskog tipa je cela generička klasa, isključujući statičke članice klase. Statička polja ne mogu biti definisana promenljivom tipa, niti statički metodi mogu da imaju parametre ili povratne vrednosti koje su parametarskog tipa. Ukoliko generička klasa sadrži neko statičko polje, svaki tip proizveden iz datog generičkog tipa, imaće svoju kopiju statičkog polja. Neka generička klasa LinkedList&lt;&gt; sadrži statičko polje count za brojanje kreiranih objekata. Svaka klasa dobijena iz generičke za konkretan argument tipa imaće svoju kopiju ovog polja. Na taj način, </p><p>count u klasi LinkedList&lt;String&gt; broji kreirane objekte ove klase </p><p>count u klasi LinkedList&lt;Point&gt; broji kreirane objekte ove klase itd. </p> <div class="mw-heading mw-heading2"><h2 id="Generički_metod_2"><span id="Generi.C4.8Dki_metod_2"></span>Generički metod</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=28" title="Uredi odjeljak Generički metod" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=28" title="Uredi kôd odjeljka Generički metod"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Možemo da definišemo metod sa svojim nezavisnim skupom od jednog ili više parametara. Takav metod naziva se parametarski metod ili generički metod. Generički metod može da postoji i unutar obične klase.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">ispisiSve</span><span class="p">(</span><span class="n">LinkedList</span><span class="w"> </span><span class="n">lista</span><span class="p">){</span> <span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">objekat</span><span class="p">:</span><span class="w"> </span><span class="n">lista</span><span class="p">)</span> <span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">objekat</span><span class="p">);</span> <span class="p">}</span> </pre></div><p>&lt;T&gt; ispred koga se navodi public ili static ključna reč predstavlja parametarski tip (ili listu tipova) za generički metod. Ovde imamo samo jedan parametarski tip za metod ispisiSve, ali ih može biti više. Lista parametarskih tipova se uvek pojavljuje između uglastih zagrada i navodi se iza kvalifikatora pristupa, a pre povratne vrednosti metoda. Argument tipa će biti određen na osnovu parametra tipa koji je prosleđen pri pozivu metoda. </p><div class="mw-heading mw-heading2"><h2 id="Nizovi_i_parametrizovani_tipovi_2">Nizovi i parametrizovani tipovi</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=29" title="Uredi odjeljak Nizovi i parametrizovani tipovi" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=29" title="Uredi kôd odjeljka Nizovi i parametrizovani tipovi"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Nizovi elemenata tipa dobijenog od generičkog tipa nisu dopušteni! </p> <div class="mw-heading mw-heading2"><h2 id="Kolekcije_2">Kolekcije</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=30" title="Uredi odjeljak Kolekcije" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=30" title="Uredi kôd odjeljka Kolekcije"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Java system kolekcija je skup generičkih tipova koje koristimo za kreiranje kolekcijskih klasa. Kolekcijska klasa je klasa koja organizuje skup objekata datog tipa na određen način (npr. lančane liste, stek,….). Najveći broj ovih klasa koje čine sistem kolekcija definisane su u paketu java.util. Razmotrićemo sledeće generičke tipove: </p> <ul><li>Iterator&lt;T&gt; interfejsni tip - deklariše metode za iteriranje kroz jedan po jedan element kolekcije</li></ul> <ul><li>ArrayList&lt;T&gt; tip -&#160;ima strukturu dinamičkog niza, broj objekata koje možemo sačuvati se automatski povećava po potrebi.</li></ul> <ul><li>LinkedList&lt;T&gt; tip - dvostruko povezana lista, omogućeno je iteriranje u oba smera</li></ul> <p>Klasu koja definiše kolekciju objekata često nazivamo kontejnerskom klasom. Postoje tri osnovna tipa kolekcija koji organizuju objekte na različite načine: </p> <ul><li>skupovi</li></ul> <ul><li>nizovi</li></ul> <ul><li>katalozi</li></ul> <div class="mw-heading mw-heading3"><h3 id="Skup_2">Skup</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=31" title="Uredi odjeljak Skup" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=31" title="Uredi kôd odjeljka Skup"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Skup(Set) je najjednostavnija kolekcija u kojoj objekti nisu na neki specijalan način uređeni I objekti se jednostavno dodaju skupu, bez ikakve kontrole gde idu. Možemo iterirati kroz sve objekte skupa, ispitati da li je neki objekat član skupa. Skup ne može da sadrži duplikate. Objekat možemo i obrisati iz skupa, ali samo ako imamo reference na njega u skupu. </p> <div class="mw-heading mw-heading3"><h3 id="Niz_2">Niz</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=32" title="Uredi odjeljak Niz" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=32" title="Uredi kôd odjeljka Niz"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Glavna karakteristika niza je da su objekti smešteni na linearan način, u proizvoljnom, fiksnom redosledu gde imamo početak i kraj. Kolekcije u opštem slučaju imaju sposobnost da se prošire da bi se smestio potreban broj objekata.Primeri: </p> <ul><li>Nizovi</li></ul> <ul><li><ul><li>ArrayList, Vector</li></ul></li></ul> <ul><li><ul><li>LinkedList</li></ul></li></ul> <ul><li>Redovi</li></ul> <ul><li><ul><li>Stack(LIFO)</li></ul></li></ul> <ul><li><ul><li>Queue(FIFO)</li></ul></li></ul> <p>Pošto je niz linearan, moguće je dodati novi objekat na početak ili kraj ili umetnuti novi objekat iza date pozicije. Dobijanje objekta iz niza se može izvršiti na vise načina: </p> <ol><li>Može se selektovati prvi ili poslednji</li> <li>Može se dobiti objekat sa date pozicije</li> <li>Može se pretraživati niz unapred ili unazad da bi se ispitalo da li se neki objekat nalazi u nizu i slično</li></ol> <div class="mw-heading mw-heading2"><h2 id="Iterator_2">Iterator</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=33" title="Uredi odjeljak Iterator" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=33" title="Uredi kôd odjeljka Iterator"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Iterator je objekat koji se koristi za iteriranje kroz kolekciju, tj. pristup jednom po jednom objektu kolekcije. Upotreba iteratora omoguće upotrebu oblika for petlje karakterističnog za pretraživanje kolekcija. Bilo koji objekat koji predstavlja skup ili niz može da kreira objekat tipa Iterator&lt;&gt;. Objekat tipa Iterator&lt;&gt; sadrži reference na sve objekte kolekcije u nekom redosledu i njima se može pristupiti pomoću metoda interfejsa Iterator&lt;&gt;: </p> <ul><li>T next() -&#160; vraća objekat tipa T i postavlja Iterator&lt;T&gt; objekat da pri sledećem pozivu ovog metoda referiše na sledeći objekat kolekcije. Ako nema objekta koji će biti vraćen, izbacuje se izuzetak tipa NoSuchElementException</li></ul> <ul><li>void remove() -&#160;briše poslednji objekat vraćen pozivom metoda next(). Ako next() nije bio pozvan ili ako se pozove remove() dva puta nakon poziva next(), biće izbačen izuzetak tipa IllegalStateException</li></ul> <p>Primer: </p><p> Klasa primerak;</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="k">while</span><span class="p">(</span><span class="n">iterator</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span> <span class="w"> </span><span class="n">primerak</span><span class="o">=</span><span class="n">iterator</span><span class="p">.</span><span class="na">next</span><span class="p">();</span> </pre></div><p>Ovde se podrazumeva da je iterator tipa Iterator&lt;Klasa&gt; i da čuva reference na objekat dobijen iz kolekcije. Jedan objekat koji implementira interfejs Iterator&lt;&gt; je za jednu iteraciju kroz kolekciju. Ukoliko je kasnije potrebno ponovo proći kroz sve elemente kolekcije , neophodno je kreirati novi objekat. </p><div class="mw-heading mw-heading3"><h3 id="List_iteratori_2">List iteratori</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=34" title="Uredi odjeljak List iteratori" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=34" title="Uredi kôd odjeljka List iteratori"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>U paketu java.util definisan je interfejs ListIterator&lt;&gt;. Deklariše metode koji se koriste za kretanje kroz kolekciju napred i nazad, tako da se do objekta može doći vise nego jednom. ListIterator&lt;&gt; interfejs nasleđuje Iterator&lt;&gt; interfejs. </p><p>Spisak metoda: </p> <ul><li>T next() -&#160; kao kod Iterator&lt;&gt;</li></ul> <ul><li>Boolean hasNext() - kao kod Iterator&lt;&gt;</li></ul> <ul><li>int nextIndex() - vraća indeks objekta koji će biti vraćen pozivom metoda next() kao tip int, ili vraća broj elemenata u listi ako je *ListIterator&lt;&gt; objekat na kraju liste</li></ul> <ul><li>T previous() – vraća prethodni objekat po redosledu u samoj listi. Koristimo ga za vraćanje kroz listu.</li></ul> <ul><li>Boolean hasPrevious() – vraća true ako prethodni poziv previous() vraća objekat.</li></ul> <ul><li>int previousIndex() -&#160;vraća indeks objekta koji će biti vraćen sledećim pozivom metoda previous() ili -1 ako je ListIterator&lt;&gt; objekat na početku liste</li></ul> <ul><li>void remove() -&#160;briše poslednji objekat dobijen pozivom metoda next() ili previous(). Ako next() ili previous() nisu bili pozvani, izbacuje se izuzetak tipa IllegalStateException, a ako operacija brisanja nije podržana za datu kolekciju, izbacuje se izuzetak tipa UnsupportedOperationException</li></ul> <ul><li>void add(T obj) – dodaje argument neposredno pre objekta koji bi bio vraćen sledećem pozivom metoda next() ili iza objekta koji bi bio vraćen sledećim pozivom metoda previous(). Poziv next() nakon dodavanja vraća dodati element, a za previous() se ništa ne menja. Ako objekat ne može da se doda izbavuje se izuzetak tipa UnsupportedOperationException ukoliko postoji neki drugi razlog zbog kojeg dodavanje ne može da se izvrši.</li></ul> <ul><li>void set(T obj) – menja poslednji objekat dobijen pozivom next() ili previous(). I ovaj metod može da izbaci izuzetke tipa UnsupportedOperationException, ClassCastException i IllegalArgumentException.</li></ul> <div class="mw-heading mw-heading2"><h2 id="ArrayList_2">ArrayList</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=35" title="Uredi odjeljak ArrayList" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=35" title="Uredi kôd odjeljka ArrayList"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>ArrayList&lt;T&gt; definiše kolekciju sa elementima tipa T. Objekat ArrayList&lt;T&gt; radi kao i niz osim što dodatno raste automatski, kada je potreban veći kapacitet. Kao i nizovi, i ArrayList sadrže reference na objekte, ne sam objekte. To je pravilo za sve kolekcije. ArrayList se, za razliku od niza, karakteriše veličinom (size). Kapacitet je maksimalan broj objekata koje ArrayList može da sadrži. Kapacitet je promenljiv, jer se automatski povećava kada se doda novi objekat u već pun vector. Metodom ensureCapacity(int) postavlja se minimalni kapacitet. </p><p> Primer:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">v</span><span class="p">.</span><span class="na">ensureCapacity</span><span class="p">(</span><span class="mi">150</span><span class="p">);</span><span class="w"> </span><span class="cm">/*ako je kapacitet objekta v manji od 150, kapacitet se uvećava na 150. AKo je 150 ili vise neće biti promenjen ovom naredbom.*/</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Konstruktori_2">Konstruktori</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=36" title="Uredi odjeljak Konstruktori" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=36" title="Uredi kôd odjeljka Konstruktori"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>ArrayList&lt;&gt;() – podrazumevani konstruktor kreira prazan ArrayList&lt;&gt; podrazumevanog kapaciteta 10. Kapacitet se povećava za 50% ukoliko se doda element u već pun ArrayList.</li></ul> <ul><li>ArrayList&lt;String&gt; a= new ArrayList&lt;String&gt;();</li></ul> <ul><li>ArrayList&lt;String&gt; a= new ArrayList&lt;String&gt;(100); - eksplicitno se zadaje kapacitet</li></ul> <div class="mw-heading mw-heading3"><h3 id="Metode_3">Metode</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=37" title="Uredi odjeljak Metode" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=37" title="Uredi kôd odjeljka Metode"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>size() – vraća broj elemenata koji su smešteni u ArrayList</li></ul> <ul><li>add(T) -&#160; dodaje se objekat iza tekućeg poslednjeg objekta u ArrayList</li></ul> <ul><li>add(int,T) – smešta se objekat na poziciju zadatu prvim argumentum, ostali se pomeraju za jedno mesto u desno.</li></ul> <ul><li>set(int,T) – postavljamo objekat u ArrayList na poziciju zadatu prvim argumentum, briše se objekat koji je prethodno bio na toj poziciji.</li></ul> <ul><li>addAll(lista) – dodaju se svi objekti druge kolekcije u ArrayList</li></ul> <ul><li>addAll(int,lista)</li></ul> <ul><li>get(int) – vraća element na zadatoj poziciji</li></ul><p> Činjenica da se kapacitet ArrayList povećava za 50% svaki put kada se ArrayList popuni utiče na to da se memorija bespotrebno zauzima. Međutim, ovo može da se prevaziđe upotrebom metoda trimToSIze(). Ovaj metod menja kapacitet tako da odgovara trenutnoj veličini.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">names</span><span class="p">.</span><span class="na">trimToSize</span><span class="p">();</span><span class="w"> </span><span class="cm">/*postavlja&#160; kapacitet na trenutnu veličinu. Ako je veličina u trenutku izvršavanja metoda 30 i kapacitet se postavlja na 30. Naravno i dalje se mogu dodavati novi objekti u ArrayList.*/</span> </pre></div><p>Možemo dobiti i ListIterator referencu iz vektora pozivanjem metoda listIterator().</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">ListIterator</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">listIterator</span><span class="p">();</span><span class="w"> </span><span class="cm">/* sada je moguće kretati se u oba smera kroz ArrayList upotrebom metoda iz klase ListIterator. */</span> <span class="n">ListIterator</span><span class="w"> </span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">listIterator</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span><span class="w"> </span><span class="cm">/* ovim se dobija ListIterator objekat koji se odnosi samo na deo ArrayList, pri čemu je argument metoda listIterator() upravo prvi element date sekvence ArrayList. */</span> <span class="n">List</span><span class="w"> </span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="n">list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">subList</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">5</span><span class="p">);</span><span class="w"> </span><span class="cm">/* dobija se podskup objekata iz ArrayList kao kolekcija tipa List&lt;&gt;. Argumetni metoda subList() su početak i kraj sekvence objekata koja čini podskup, pri čemu poslednji element nije uključen. */</span> </pre></div><p>Moguće su i kombinacije: </p><p>ListIterator&lt;String&gt; listIter = names.subList(5,15).listIterator(2); /* subList() vraća podlistu objekata ArrayList od pozicije 5 do pozicije 14 zaključno. Nakon toga se za datu listu poziva metod listIterator() koji vraća list iterator nad elementima liste počevši od elementa sa indeksom 2, pa do kraja. To odgovara elementima polaznog ArrayList sa indeksima od 7 do 14. Ovim iteratorom se kroz datu sekvencu objekata polaznog ArrayList može kretati u oba smera. */ </p><p> Metod toArray() omogućava da se elementi vektora dobiju u obliku običnog niza.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">names</span><span class="p">.</span><span class="na">toArray</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">String</span><span class="o">[</span><span class="n">names</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="o">]</span><span class="p">);</span><span class="w"> </span><span class="cm">/* argument metoda toArray() mora biti niz elemenata istog tipa kao i elementi ArrayList&#160; ili nadtipa. Ako niz nije dovoljne veličine da primi sve elemente ArrayList, kreiraće se novi niz i referenca na taj niz će biti vraćena. Ovde metod toArray() vraća niz String[] koji sadrži sve elemente ArrayList names u odgovarajućem redosledu.*/</span> <span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">people</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="err">“</span><span class="n">Bill</span><span class="err">”</span><span class="p">,</span><span class="w"> </span><span class="err">“</span><span class="n">Barbara</span><span class="err">”</span><span class="p">,</span><span class="w"> </span><span class="err">“</span><span class="n">Brian</span><span class="err">”</span><span class="p">};</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">nameList</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">java</span><span class="p">.</span><span class="na">util</span><span class="p">.</span><span class="na">Arrays</span><span class="p">.</span><span class="na">asList</span><span class="p">(</span><span class="n">people</span><span class="p">);</span> </pre></div><p>Statički parametarski metod asList() definisan u klasi java.util.Arrays konvertuje niz elemenata datog tipa T u List&lt;T&gt; kolekciju. Argument metoda je niz koji se konvertuje i vraća se referenca tipa List&lt;T&gt;. Ova referenca se može proslediti kao argument konstruktoru klase ArrayList:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="p">(</span><span class="n">nameList</span><span class="p">);</span><span class="w"> </span><span class="cm">/* Time se dobija ArrayList koji sadrži elemente datog niza. */</span> </pre></div><p>Brisanje elemenata: </p><ul><li>remove(int) – brisanje reference na objekat na zadatoj poziciji. Vraća se referenca&#160; na uklonjeni objekat, tako da ostaje mogućnost da se sačuva referenca nakon što se ukloni iz ArrayList.</li></ul> <ul><li>remove(T) – brisanje prvog objekta sa zadatom referencom. Ukoliko je pronađen i uklonjen objekat, vraća se true, inače false</li></ul> <ul><li>removeAll(names.subList(2,5)); - brišu se elementi sa indeksima od 2 do 4</li></ul> <ul><li>retailAll(names.subList(2,5)); - ostaju samo elementi sa indeksima od 2 do 4</li></ul> <ul><li>removeAllElements() – uklanja sve elemente iz ArrayList</li></ul> <p>Da li je ArrayList prazan može se utvrditi metodom isEmpty(). Ukoliko je veličina 0, metod vraća true, inače false. Ukoliko ArrayList sadrži samo null elemente, to ne znači da je prazan tj da je veličina 0 ili da će metod isEmpty() vratiti true. Da bi se ispraznio elementi tj reference na objekte moraju biti uklonjene, a ne samo postavljene na null. </p><p>Pretraživanje ArrayList: </p> <ul><li>int indexOf(T) – vraća poziciju datog objekta u ArrayList</li></ul> <ul><li>int indexOf(T,int) – vraća prvu poziciju datog objekta u ArrayList, počevši od pozicije zadate kao drugi argument</li></ul> <p>Za sortiranje elemenata kolekcije najbolje je implementirati interfejs Comparable&lt;&gt;. On deklariše samo jedan metod compareTo() – vraća -1, 0 ili 1 ako je objekat manji, jednak ili veći od argumenta. Ako je Comparable&lt;&gt; interfejs implementiran za tip objekta smešten u kolekciji, možemo samo objekat kolekcije predati kao argument metodu Collections.sort() interfejsa Collections&lt;&gt;. </p> <div class="mw-heading mw-heading2"><h2 id="Povezana_lista_(LinkedList)_2"><span id="Povezana_lista_.28LinkedList.29_2"></span>Povezana lista (LinkedList)</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=38" title="Uredi odjeljak Povezana lista (LinkedList)" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=38" title="Uredi kôd odjeljka Povezana lista (LinkedList)"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Konstuktori_2">Konstuktori</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=39" title="Uredi odjeljak Konstuktori" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=39" title="Uredi kôd odjeljka Konstuktori"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>bez argumenata</li></ul> <ul><li>sa argumentom Collection&lt;&gt; koji kreira LinkedList&lt;&gt; objekat koji sadrži objekte kolekcije koja se prosleđuje kao argument</li></ul> <div class="mw-heading mw-heading3"><h3 id="Metode_4">Metode</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=40" title="Uredi odjeljak Metode" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=40" title="Uredi kôd odjeljka Metode"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>add(),addAll() – kao kod klase Vector&lt;&gt;</li></ul> <ul><li>addFirst() – dodaje objekat na početak liste</li></ul> <ul><li>addLast() – dodaje objekat na kraj liste</li></ul> <ul><li>get(int) – kao kod klase Vector&lt;&gt;</li></ul> <ul><li>getFirst(),getLast()</li></ul> <ul><li>remove(),removeFirst(),removeLast()</li></ul> <ul><li>set()</li></ul> <ul><li>size() – vraća broj elemenata liste</li></ul> <p>Meotdom iterator() dobija se Iterator&lt;&gt; objekat nad listom. Metodom listIterator() objekat ListIterator&lt;&gt;, kao i kod klase Vector&lt;&gt; </p> <div class="mw-heading mw-heading2"><h2 id="Katalozi_2">Katalozi</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=41" title="Uredi odjeljak Katalozi" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=41" title="Uredi kôd odjeljka Katalozi"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Katalog (HashMap&lt;K,V&gt;) takođe nazivamo i rečnikom. Zajedno se čuvaju i ključ i objekat. Svaki objekat je jedinstveno određen svojim ključem. Svi ključevi, iz tog razloga, moraju da budu različiti. Izdvajanje objekata iz kataloga vrši se pomoću odgovarajućeg ključa, jer ključ određuje gde se u katalogu nalazi objekat. Sve klase za rad sa katalozima implementiraju generički interfejs Map&lt;K,V&gt;. Razmatraćemo generičku klasu HashMap&lt;K,V&gt;.&#160; Implementacija kataloga pomoću generičke klase HashMap&lt;&gt; podrazumeva da su parovi ključ/objekat smešteni u niz. Indeks u nizu dobija se na osnovu ključa za šta se koristi metod hashCode().Ovaj metod nasleđuje se iz klase Object i on proizvodi podrazumevani heškod, osim ako nije predefinisan u nekoj od izvedenih klasa. Stoga, bilo koji objekat može da bude korišćen kao ključ. Na osnovu njega se metodom hashCode() generiše heškod kojim se određuje indeks para sa datim ključem u nizu. </p> <div class="mw-heading mw-heading2"><h2 id="Heširanje_2"><span id="He.C5.A1iranje_2"></span>Heširanje</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=42" title="Uredi odjeljak Heširanje" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=42" title="Uredi kôd odjeljka Heširanje"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Ako želimo da kao ključeve koristimo objekte koje sami definišemo, treba da predefinišemo metod equals() iz klase Object. Da bi se obezbedila potrebna funkcionalnost, nova verzija treba da vrati true kada dva različita objekta sadrže iste vrednosti.&#160;Takođe, moguće je predefinisati metod hashCode() tako da raspodela bude prilično uniformna na skupu mogućih vrednosti za ključeve. Jedan način je da se za svaki podatak-članicu klase generiše ceo broj npr. postojećim metodom hashCode() koji se zatim množi prostim brojem (svaki član različitim) i na kraju se dobijeni rezultati sumiraju. Generisanje celog broja za podatak-članicu klase se obično vrši pozivanjem metoda hashCode(). Proste brojeve treba birati tako da ne budu preveliki, kako rezultat ne bi bio van opsega za int. Kad god je podatak-članica klase objekat neke druge klase, a ne primitivnog tipa, neophodno je implementirati hashCode() metod za datu klasu. </p> <div class="mw-heading mw-heading3"><h3 id="Konstuktori_za_HashMap&lt;&gt;_2"><span id="Konstuktori_za_HashMap.3C.3E_2"></span>Konstuktori za HashMap&lt;&gt;</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=43" title="Uredi odjeljak Konstuktori za HashMap&lt;&gt;" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=43" title="Uredi kôd odjeljka Konstuktori za HashMap&lt;&gt;"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>HashMap() – podrazumevani, kreira katalog podrazumevanog kapaciteta 16, a podrazumevani load faktor je 0.75</li></ul> <ul><li>HashMap(int capacity) – kreira katalog datog kapaciteta, sa podrazumevanim load faktorom</li></ul> <ul><li>HashMap(int capacity, float loadFactor) – kreira katalog sa datim kapacitetom i load faktorom</li></ul> <ul><li>četvri konstuktor kreira katalog na osnovu postojećeg kataloga</li></ul> <p>Kapacitet kataloga je broj parova ključ/objekat koji mogu da se čuvaju. Automatski se povećava, ako je neophodno.&#160; Poželjno je da se za kapacitet kataloga zadaje prost broj, kako bi se izbegla kolizija. Faktor punjenja (load faktor) se koristi za odlučivanje kada kapacitet heš tabele treba da se poveća . Kada veličina tabele dostigne vrednost proizvoda faktora punjenja i kapaciteta, kapacitet se automatski povećava dva puta uz dodavanje 1 da bi se osiguralo da je novi kapacitet barem neparan, ako već nije prost. </p><p>Smeštanje, dobijanje i uklanjanje objekata kataloga: </p> <ul><li>V put(K key, V value) – smešta objekat value u katalog koristeći ključ key.</li></ul> <ul><li>V remove(Object key) – uklanja par povezan sa ključem ako postoji i vraća referencu na objekat. Ukoliko ne postoji odgovarajući par sa datim ključem, ili je objekat pridružen ključu null, vraća se null.</li></ul> <ul><li>V get(Object key) – vraća objekat sa istim ključem kao key. Objekat ostaje u katalogu. Ako nema nijednog objekta sa datim ključem, ili je null smešteno umesto objekta, vraća se null</li></ul> <p>Ako get() vrati null, ne znamo da li objekat povezan sa ključem ne postoji ili je objekat null. Za ovo služi metod containsKey() koji kao argument ima dati ključ. On vraća true ako je ključ smešten u katalogu. </p><p>Map&lt;&gt; interfejs obezbeđuje 3 načina za dobijanje kolekcionog pregleda sadržaja kataloga: </p> <ul><li>keySet() – vraća Set objekat koji referiše na ključeve kataloga</li></ul> <ul><li>entrySet() – vraća Set&lt;Map.Entry&gt; objekat koji referiše na parove ključ/objekat – svaki par je objekat tipa Map.Entry. Entry je generički interfejsni tip definisan unutar interfejsa Map&lt;&gt;.</li></ul> <ul><li>values() – vraća Collection objekat koji referiše na objekte iz kataloga.</li></ul> <div class="mw-heading mw-heading2"><h2 id="Generičke_klase_2"><span id="Generi.C4.8Dke_klase_2"></span>Generičke klase</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=44" title="Uredi odjeljak Generičke klase" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=44" title="Uredi kôd odjeljka Generičke klase"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Na isti način, kao što se definišu generičke funkcije, mogu se definisati I generičke klase. Definicija članova klase se provodi pomoću generičkog tipa. Na primer</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">array</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="p">...</span> <span class="p">}</span> </pre></div><p>pomoću koje se može realizovati nizovi proizvoljnog tipa. Na primer deklaracijom</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">myints</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div><p>se formira niz od 5 celobrojnih elemenata, a sa</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">mystrings</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div><p>se formira niz od 5 stringova.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">array</span><span class="p">{</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">*</span><span class="n">m_pbuff</span><span class="p">;</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="kd">public</span><span class="p">:</span> <span class="w"> </span><span class="n">array</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">):</span><span class="w"> </span> <span class="w"> </span><span class="n">m_size</span><span class="p">(</span><span class="n">N</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">m_pbuff</span><span class="o">=</span><span class="k">new</span><span class="w"> </span><span class="n">T</span><span class="o">[</span><span class="n">N</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="o">~</span><span class="n">array</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">delete</span><span class="w"> </span><span class="o">[]</span> <span class="w"> </span><span class="n">m_pbuff</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">size</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">set</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">value</span><span class="p">);</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">);</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> <span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">::</span><span class="n">set</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">value</span><span class="p">){</span> <span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">x</span><span class="o">]=</span><span class="n">value</span><span class="p">;</span> <span class="p">}</span> <span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">::</span><span class="n">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_pbuff</span><span class="o">[</span><span class="n">x</span><span class="o">]</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Get() i set() funkcije smo mogli definisati inline unutar definicije klase. One su definisane izvan klase kako bi se pokazalo da se tada uvek ispred definicije funkcije mora napisati generički prefiks: template &lt;class T&gt;.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">myints</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">myfloats</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="w"> </span><span class="n">myints</span><span class="p">.</span><span class="na">set</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">);</span> <span class="w"> </span><span class="n">myfloats</span><span class="p">.</span><span class="na">set</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mf">3.1416</span><span class="p">);</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;myints ima: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myints</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot; elemenata&quot;</span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myints</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myfloats</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Rezultat je: </p><p>myints ima: 5 elemenata </p><p>100 </p><p>3.1416 </p><p>Elementima niza se pristupa pomoću set/get funkcija ili pomoću indeksne notacije. </p><p>Primer: </p><p> Klasa pair služi kao kontenjer dva elementa koji mogu biti različitih tipova. Formiraćemo niz takvih parova pomoću generičke klase array. U taj niz ćemo upisati i iz njega ispisati niz parova kojima prvi element predstavlja redni broj (tip int), a drugi element je kvadratni koren prvoga (tip float).</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T1</span><span class="p">,</span><span class="w"> </span><span class="kd">class</span> <span class="nc">T2</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">pair</span><span class="p">{</span> <span class="w"> </span><span class="n">T1</span><span class="w"> </span><span class="n">value1</span><span class="p">;</span> <span class="w"> </span><span class="n">T2</span><span class="w"> </span><span class="n">value2</span><span class="p">;</span> <span class="w"> </span><span class="kd">public</span><span class="p">:</span> <span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">(</span><span class="n">T1</span><span class="w"> </span><span class="n">first</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">T2</span><span class="w"> </span><span class="n">second</span><span class="o">=</span><span class="mi">0</span><span class="p">){</span> <span class="w"> </span><span class="n">value1</span><span class="o">=</span><span class="n">first</span><span class="p">;</span> <span class="w"> </span><span class="n">value2</span><span class="o">=</span><span class="n">second</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">T1</span><span class="w"> </span><span class="nf">GetFirst</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="k">return</span><span class="w"> </span><span class="n">value1</span><span class="p">;}</span> <span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">SetFirst</span><span class="w"> </span><span class="p">(</span><span class="n">T1</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">value1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">T2</span><span class="w"> </span><span class="nf">GetSecond</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">value2</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">SetSecond</span><span class="w"> </span><span class="p">(</span><span class="n">T2</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">value2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="p">};</span> <span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">(){</span> <span class="w"> </span> <span class="c1">// niz od 5 parova int,float</span> <span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">arr</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="w"> </span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">SetFirst</span><span class="p">(</span><span class="n">i</span><span class="p">);</span><span class="c1">//prvi sadrži redni broj</span> <span class="w"> </span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">SetSecond</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">i</span><span class="p">));</span><span class="c1">//kvadratni koren prvog</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">arr</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">GetFirst</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="sc">&#39;:&#39;</span> <span class="w"> </span><span class="o">&lt;&lt;</span><span class="n">arr</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="na">GetSecond</span><span class="p">()</span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Rezultat je:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="mi">0</span><span class="p">:</span><span class="mi">0</span> <span class="mi">1</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2</span><span class="p">:</span><span class="mf">1.41421</span> <span class="mi">3</span><span class="p">:</span><span class="mf">1.73205</span> <span class="mi">4</span><span class="p">:</span><span class="mi">2</span> </pre></div><p>Važno je upozoriti na oblik deklaracije niza parova:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div> <ol><li>Vidimo da se konkretna realizacija generičkog tipa može izvršiti i pomoću drugih generičkih tipova.</li> <li>U deklaraciji se pojavljuju dva znaka &gt; &gt;. Između njih obvezno treba napisati razmak, jer ako bi napisali<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="nf">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span><span class="w"> </span><span class="c1">// greška&#160;: &gt;&gt;</span> </pre></div>kompajler bi prijavio grešku zbog toga jer se znak &gt;&gt; tretira kao operator.</li></ol><p> Da bi se izbegle ovakove greške, preporučuje se korišćenje&#160; typedef deklaracije oblika:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">typedef</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="n">if_pair</span><span class="p">;</span> <span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="n">if_pair</span><span class="o">&gt;</span><span class="w">&#160; </span><span class="nf">arr</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Specijalizacija_šablona_2"><span id="Specijalizacija_.C5.A1ablona_2"></span>Specijalizacija šablona</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=45" title="Uredi odjeljak Specijalizacija šablona" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=45" title="Uredi kôd odjeljka Specijalizacija šablona"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Standardna_biblioteka_%C5%A1ablona" title="Standardna biblioteka šablona">Standardna biblioteka šablona</a><sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">&#91;</span>4<span class="cite-bracket">&#93;</span></a></sup> je softverksa bibliotea programskog jezika C++ koja je delimično uključena u S++ standardnu biblioteku. Obezbeđuje četiri kopmonente: kontejnere, iteratore, algoritme i&#160; funktore. STL obezbeđuje gotov skup osnovnih klasa za C++ kao što su kontejneri i asocijativni nizovi,&#160; koji se može koristiti uz bilo koji ugrađeni tip i uz bilo koji korisnički definisan tip koji podržava neke osnovne operacije (kao što su kopiranje i dodela). STL algoritmi su nezavisni od kotejnera, što značajno smanjuje kompleksnost biblioteke. STL ostvaruje rezultate kroz upotrebu šablona. Ovaj pristup obezbeđuje polimorfizam vremena kompajliranja koji je često efikasniji od tradicionalnog polimorfizma vremena pokretanja. Moderni C++ prevodioci podešeni su tako da minimalizuju bilo kakvu kaznz apstrakcije nastalu intezivnom upotrebom STL-a. STL je nastao kao prva biblioteka generičkih algoritama i struktura podataka za C++, sa četiri ideje na umu: generičko programiranje, apstrakcija bez gubitka efikasnosti, fon Nojmanova arhitektura i vrednosna semantika. </p><p>Ponekad se s jednim šablonom ne mogu obuhvatiti svi slučajevi realizacije s različitim tipovima. U tom slučaju, za tipove kojima realizacija odstupa od šablona, može definisati poseban slučaj realizacije koji nazivamo specijalizacija šablona. </p><p> Za klasu koju definišemo šablonon:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">gen_tip</span><span class="o">&gt;</span><span class="w"> </span><span class="n">identifikator</span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>Specijalizacija za konkretan tip se zapisuje u obliku:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="o">&lt;&gt;</span><span class="kd">class</span> <span class="nc">identifikator</span><span class="o">&lt;</span><span class="n">konkretan_tip</span><span class="o">&gt;</span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>Specijalizacija se smatra delom šablona, stoga njena deklaracija započinje sa tamplate&lt;&gt;. U njoj se moraju definisati svi članovi šablčona, ali isključivo sa konkretnim tipovima za koje se vrši specijalizacija šablona. Podrazumeva se da moraju biti definisani konstruktor i destruktor, ukoliko su definisani u opštem šablonu. </p><div class="mw-heading mw-heading2"><h2 id="Šabloni_sa_konstantnim_parametrima_2"><span id=".C5.A0abloni_sa_konstantnim_parametrima_2"></span>Šabloni sa konstantnim parametrima</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=46" title="Uredi odjeljak Šabloni sa konstantnim parametrima" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=46" title="Uredi kôd odjeljka Šabloni sa konstantnim parametrima"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> Parametri šablona mogu biti i integralne konstante (int,char,long, unsigned). Na primer,</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="o">&gt;</span><span class="w">&#160; </span><span class="kd">class</span> <span class="nc">array</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="p">...</span> <span class="p">}</span> </pre></div><p>je šablon za definiranje klase array pomoću generičkog tipa T i integralne konstante N. Vrednost integralne konstante se mora specificirati pri deklaraciji objekta. Na primer, </p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">float</span><span class="p">,</span><span class="mi">5</span><span class="o">&gt;</span><span class="w"> </span><span class="n">myfloats</span><span class="p">;</span> </pre></div><p>deklariše se myfloat kao niz realnih brojeva kojem se dodatna svojstva zadaju s konstantom N=5. U sledećem primeru koristićemo ovaj konstantni parametar za postavljanje veličine niza.</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="o">&gt;</span> <span class="kd">class</span> <span class="nc">array</span><span class="p">{</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">m_buff</span><span class="o">[</span><span class="n">N</span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od N elemenata</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="kd">public</span><span class="p">:</span> <span class="w"> </span><span class="n">array</span><span class="p">()</span><span class="w">&#160;</span><span class="p">:</span><span class="w"> </span><span class="n">m_size</span><span class="p">(</span><span class="n">N</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">size</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_size</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_buff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">operator</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="kd">const</span><span class="p">{</span><span class="w"> </span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">m_buff</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="p">};</span> <span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="mi">5</span><span class="o">&gt;</span><span class="w"> </span><span class="n">myints</span><span class="p">;</span> <span class="w"> </span><span class="n">array</span><span class="o">&lt;</span><span class="kt">float</span><span class="p">,</span><span class="mi">5</span><span class="o">&gt;</span><span class="w"> </span><span class="n">myfloats</span><span class="p">;</span> <span class="w"> </span><span class="n">myints</span><span class="o">[</span><span class="mi">0</span><span class="o">]=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span> <span class="w"> </span><span class="n">myfloats</span><span class="o">[</span><span class="mi">3</span><span class="o">]=</span><span class="w"> </span><span class="mf">3.1416</span><span class="p">;</span><span class="w"> </span><span class="mi">13</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;myints ima: &quot;</span><span class="o">&lt;&lt;</span><span class="n">myints</span><span class="p">.</span><span class="na">size</span><span class="p">()</span> <span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot; elemenata&quot;</span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myints</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">myfloats</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div><p>Dobije se ispis:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="mi">100</span> <span class="mf">3.1416</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Predodređeni_i_funkcijski_parametri_šablona_2"><span id="Predodre.C4.91eni_i_funkcijski_parametri_.C5.A1ablona_2"></span>Predodređeni i funkcijski parametri šablona</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=47" title="Uredi odjeljak Predodređeni i funkcijski parametri šablona" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=47" title="Uredi kôd odjeljka Predodređeni i funkcijski parametri šablona"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div><p> U šablonima se mogu koristiti predodređeni parametri. Na primer, šablonom</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">=</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">N</span><span class="o">=</span><span class="mi">10</span><span class="o">&gt;</span><span class="w"> </span><span class="kd">class</span> <span class="nc">array</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="err">…</span> <span class="p">}</span> </pre></div><p>se omogućuju deklaracije oblika:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">array</span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="n">a_int_10</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od 10 int</span> <span class="n">array</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="n">a_float_10</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od 10 float</span> <span class="n">array</span><span class="o">&lt;</span><span class="kt">char</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="o">&gt;</span><span class="w"> </span><span class="n">a_char_100</span><span class="p">;</span><span class="w"> </span><span class="c1">// niz od 100 char</span> </pre></div><p><i>Napomena:</i> predodređeni parametri se ne smeju koristiti u funkcijskim šablonima Parametri šablona mogu biti funkcije:</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kt">int</span><span class="w"> </span><span class="nf">Tfunc</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="o">&gt;</span> <span class="kd">class</span> <span class="nc">X</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="p">...</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Tfunc</span><span class="p">(</span><span class="n">x</span><span class="p">);</span><span class="w"> </span><span class="o">!!!</span> <span class="w"> </span><span class="p">...</span> <span class="p">}</span> </pre></div><p>Moramo paziti da uzimamo što manje pretpostavki na tipove koji su parametri šablona. Preporučuje se: parametri generičkih funkcija su const reference (da bismo izbegli zahtev da se objekti moraju kopirati, da postoji i da je dobro definisan copz konstruktor), za upoređivanje koristimo samo operator &lt; (ne i operator &gt;, operator &gt;=, itd)</p><div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">template</span><span class="w"> </span><span class="o">&lt;</span><span class="kd">class</span> <span class="nc">T</span><span class="o">&gt;</span> <span class="n">T</span><span class="w"> </span><span class="nf">min</span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">&amp;</span><span class="n">b</span><span class="p">){</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">a</span><span class="w">&#160;</span><span class="p">:</span><span class="w"> </span><span class="n">b</span><span class="p">;</span> <span class="p">}</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Poređenje_šablona_i_makro_naredbi_2"><span id="Pore.C4.91enje_.C5.A1ablona_i_makro_naredbi_2"></span>Poređenje šablona i makro naredbi</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=48" title="Uredi odjeljak Poređenje šablona i makro naredbi" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=48" title="Uredi kôd odjeljka Poređenje šablona i makro naredbi"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Šablone možemo smatrati integralnim makro naredbama. Primena šablona ima nekoliko prednosti u odnosu na makro naredbe: </p> <ol><li>Lakše ih je shvatiti jer šabloni izgledaju kao regularne klase(ili funkcije)</li> <li>U razvoju šablona lakše se prevodi testiranje s različitim tipovima</li> <li>Kompajler osigurava znatno veću kontrolu grešala nego je to slučaj s makro naredbama</li> <li>Funkcijski šabloni imaju definisan doseg, jer se mogu definisati kao deo klase (friend) ili namespace</li> <li>Funkcijski šabloni mogu biti rekurzivni</li> <li>Funkcijski šabloni se mogu preopteretiti</li> <li>Pri komplajliranju neke datoteke, kompajler mora raspolagati s potpunom implementacijom šablona. Stoga je uobičajeno da se specifikacija i implementacija funkcija zapisuje u istoj „.h“ datoteci. Makro karakter šablona se posebno očitava kod klasa koje imaju statičke članove. U tom slučaju se za svaku realizaciju šablona inicira posebno statička promenljiva (kod regularnih se klasa za sve objekte jedne klase generiše samo jedna statička promenljiva)</li></ol> <div class="mw-heading mw-heading2"><h2 id="Definicija_i_upotreba_klase_tvector&lt;class_T&gt;_2"><span id="Definicija_i_upotreba_klase_tvector.3Cclass_T.3E_2"></span>Definicija i upotreba klase tvector&lt;class T&gt;</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=49" title="Uredi odjeljak Definicija i upotreba klase tvector&lt;class T&gt;" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=49" title="Uredi kôd odjeljka Definicija i upotreba klase tvector&lt;class T&gt;"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Generička klasa tvector predstavlja podskup standatdne klase vector. Namenjeno joj je manipulisanje s homogenim kolekcijama elemenata proizvoljnog tipa. Izvršičemo specifikaciju i implementa klase tvector temeljem znanja koja smo stekli razmatrajući generičku klasu array i klasu Tstring. </p><p>Objekti tvector klasse imaju sledeće karakteristike: </p> <ul><li>capacity() – kapacitet vektor je broj ćelija koje se automatski alociraju za spremanje elemenata vektora</li> <li>size() – veličina vektora je broj elemenata koje stvarno sadrži vektor</li> <li>resize(n) – ako je potreban veći kapacitet vektora, on se može dobiti pozivom funkcije resize(n)</li> <li>operator [] – pojedinom elementu vektora se pristupa pomoću indeksnog operatora, ili se koriste dve funkcije: <ul><li>push_back(el) dodaje element na indeksu iza poslednje upisanog elementa</li> <li>pop_back(el) briše poslednji element iz vektora</li></ul></li></ul> <p>Pri pozivu push_back() funkcije vodi se računa o kapacitetu vektora i vrši se automatsko alociranje potrebne memorije (memorija se udvostručuje ako potrebna veličina vektora premašuje trenutni kapacitet). Namena ove dve funkcije je da se vektor može koristiti kao dinamička kolekcija elemenata (kontejner). </p> <div class="mw-heading mw-heading2"><h2 id="Reference_2">Reference</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;veaction=edit&amp;section=50" title="Uredi odjeljak Reference" class="mw-editsection-visualeditor"><span>uredi</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Generi%C4%8Dko_programiranje&amp;action=edit&amp;section=50" title="Uredi kôd odjeljka Reference"><span>uredi kod</span></a><span class="mw-editsection-bracket">]</span></span></div> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r41556849"><div class="reflist"> <div class="mw-references-wrap"><ol class="references"> <li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><span class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20161220085102/http://marjan.fesb.hr/~mateljan/cpp/slides12-templates.pdf">„Generičke funkcije i klase – template (predlošci)”</a>.&#32;Arhivirano&#32;iz <a rel="nofollow" class="external text" href="http://marjan.fesb.hr/~mateljan/cpp/slides12-templates.pdf">originala</a>&#32;na datum 2016-12-20<span class="reference-accessdate">.&#32;Pristupljeno 2019-01-17</span>.</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=bookitem&amp;rft.btitle=Generi%C4%8Dke+funkcije+i+klase+%E2%80%93+template+%28predlo%C5%A1ci%29&amp;rft.atitle=&amp;rft_id=https%3A%2F%2Fweb.archive.org%2Fweb%2F20161220085102%2Fhttp%3A%2F%2Fmarjan.fesb.hr%2F%7Emateljan%2Fcpp%2Fslides12-templates.pdf&amp;rfr_id=info:sid/en.wikipedia.org:Generi%C4%8Dko_programiranje"><span style="display: none;">&#160;</span></span></span> </li> <li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.ftn.kg.ac.rs/publikacije/IT/3%20linkovi%20i%20prilozi/_private/Programski%20jezici/Ostale%20strane/IZDVAJAMO%20IZ%20SADRZAJA.htm#Generički+mehanizam+(šabloni)">Generički mehanizam</a></span> </li> <li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a></span> <span class="reference-text"><span class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20161220135125/http://poincare.matf.bg.ac.rs/~stasa/OOP/Cas%2009.pdf">„Generički klasni tipovi”</a>.&#32;Arhivirano&#32;iz <a rel="nofollow" class="external text" href="http://poincare.matf.bg.ac.rs/~stasa/OOP/Cas%2009.pdf">originala</a>&#32;na datum 2016-12-20<span class="reference-accessdate">.&#32;Pristupljeno 2019-01-17</span>.</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=bookitem&amp;rft.btitle=Generi%C4%8Dki+klasni+tipovi&amp;rft.atitle=&amp;rft_id=https%3A%2F%2Fweb.archive.org%2Fweb%2F20161220135125%2Fhttp%3A%2F%2Fpoincare.matf.bg.ac.rs%2F%7Estasa%2FOOP%2FCas%252009.pdf&amp;rfr_id=info:sid/en.wikipedia.org:Generi%C4%8Dko_programiranje"><span style="display: none;">&#160;</span></span></span> </li> <li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a></span> <span class="reference-text"><a class="external text" href="https://sr.wikipedia.org/sr-el/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D0%B4%D0%BD%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0">Standardna biblioteka šablona</a></span> </li> </ol></div></div> <!-- NewPP limit report Parsed by mw‐web.eqiad.main‐6c8dfcb594‐lsx6j Cached time: 20241126222932 Cache expiry: 2592000 Reduced expiry: false Complications: [show‐toc] CPU time usage: 0.237 seconds Real time usage: 3.918 seconds Preprocessor visited node count: 3470/1000000 Post‐expand include size: 16016/2097152 bytes Template argument size: 9196/2097152 bytes Highest expansion depth: 15/100 Expensive parser function count: 86/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 115936/5000000 bytes Lua time usage: 0.007/10.000 seconds Lua memory usage: 1033124/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 116.739 1 -total 83.55% 97.539 2 Šablon:Reflist 46.18% 53.910 4 Šablon:Cite_web 41.77% 48.763 4 Šablon:Citation/core 19.07% 22.263 4 Šablon:Replace 6.38% 7.445 8 Šablon:Str_crop 3.30% 3.850 2 Šablon:Main_other 2.32% 2.714 8 Šablon:Citation/make_link --> <!-- Saved in parser cache with key shwiki:pcache:4631537:|#|:idhash:canonical!sh-latn and timestamp 20241126222932 and revision id 41273773. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1&amp;useformat=desktop" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="" lang="sh-Latn" dir="ltr">Izvor: <a dir="ltr" href="https://sh.wikipedia.org/w/index.php?title=Generičko_programiranje&amp;oldid=41273773">https://sh.wikipedia.org/w/index.php?title=Generičko_programiranje&amp;oldid=41273773</a></div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Posebno:Kategorije" title="Posebno:Kategorije">Kategorije</a>: <ul><li><a href="/wiki/Kategorija:Programiranje" title="Kategorija:Programiranje">Programiranje</a></li><li><a href="/wiki/Kategorija:Programske_paradigme" title="Kategorija:Programske paradigme">Programske paradigme</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" lang="sh-Latn" dir="ltr"> <ul id="footer-info"> <li id="footer-info-lastmod"> Ova stranica je posljednji put izmijenjena 17. oktobra 2022. u 14:03.</li> <li id="footer-info-copyright">Tekst je dostupan pod licencom <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-ShareAlike</a>; mogu se primijeniti i dodatni uslovi. Za više informacija pogledajte <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Uslove korištenja</a>.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Pravila o privatnosti</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedija:O_projektu">O projektu</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedija:Op%C4%87e_odricanje_odgovornosti">Odricanje odgovornosti</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Kodeks ponašanja</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Programeri</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/sh.wikipedia.org">Statistika</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Izjava o kolačićima</a></li> <li id="footer-places-mobileview"><a href="//sh.m.wikipedia.org/w/index.php?title=Generi%C4%8Dko_programiranje&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobilni prikaz</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-5c59558b9d-2j5kz","wgBackendResponseTime":216,"wgPageParseReport":{"limitreport":{"cputime":"0.237","walltime":"3.918","ppvisitednodes":{"value":3470,"limit":1000000},"postexpandincludesize":{"value":16016,"limit":2097152},"templateargumentsize":{"value":9196,"limit":2097152},"expansiondepth":{"value":15,"limit":100},"expensivefunctioncount":{"value":86,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":115936,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 116.739 1 -total"," 83.55% 97.539 2 Šablon:Reflist"," 46.18% 53.910 4 Šablon:Cite_web"," 41.77% 48.763 4 Šablon:Citation/core"," 19.07% 22.263 4 Šablon:Replace"," 6.38% 7.445 8 Šablon:Str_crop"," 3.30% 3.850 2 Šablon:Main_other"," 2.32% 2.714 8 Šablon:Citation/make_link"]},"scribunto":{"limitreport-timeusage":{"value":"0.007","limit":"10.000"},"limitreport-memusage":{"value":1033124,"limit":52428800}},"cachereport":{"origin":"mw-web.eqiad.main-6c8dfcb594-lsx6j","timestamp":"20241126222932","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"Generi\u010dko programiranje","url":"https:\/\/sh.wikipedia.org\/wiki\/Generi%C4%8Dko_programiranje","sameAs":"http:\/\/www.wikidata.org\/entity\/Q1051282","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q1051282","author":{"@type":"Organization","name":"Doprinositelji Wikimedijinim projektima"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2019-01-17T22:56:19Z","dateModified":"2022-10-17T13:03:49Z"}</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10