templates c with examples
Spoznajte različne vidike predlog v jeziku C ++.
Predloge so ena najmočnejših funkcij v C ++. Predloge nam zagotavljajo kodo, ki je neodvisna od vrste podatkov.
Z drugimi besedami, z uporabo predlog lahko napišemo generično kodo, ki deluje na kateri koli podatkovni tip. Podatkovni tip moramo le posredovati kot parameter. Ta parameter, ki posreduje podatkovni tip, se imenuje tudi ime tipa.
V tej vadnici bomo podrobno preučili vse o predlogah in njihovih različnih vidikih.
=> Kliknite tukaj za absolutno serijo usposabljanj C ++.
najboljša čistilna programska oprema za Windows 10
Kaj se boste naučili:
- Kaj so predloge?
- Kako uporabljati predloge / izvedbo?
- typename Vs. ključna beseda razreda
- Instantacija in specializacija predloge
- Specializacija za predloge
- C ++ Variadic Predloge
- Zaključek
- Priporočeno branje
Kaj so predloge?
Kot smo že omenili, so predloge splošne, tj.neodvisne od vrste podatkov. Predloge se uporabljajo predvsem za zagotovitev ponovne uporabnosti kode in prilagodljivosti programov. Lahko ustvarimo preprosto funkcijo ali razred, ki za parameter vzame podatkovni tip, in implementiramo kodo, ki deluje za kateri koli podatkovni tip.
Na primer, če želimo, da algoritem za razvrščanje deluje tako za vse številske podatkovne tipe, kot tudi za znakovne nize, potem samo napišemo funkcijo, ki za argument vzame podatkovni tip, in izvedemo tehniko razvrščanja.
Nato lahko glede na vrsto podatkov (ime tipa), ki se posreduje algoritmu za razvrščanje, podatke razvrstimo ne glede na vrsto podatkov. Tako nam ni treba napisati deset algoritmov za deset podatkovnih vrst.
Tako lahko predloge uporabljamo v aplikacijah, kjer zahtevamo, da je koda uporabna za več kot eno vrsto podatkov. Predloge se uporabljajo tudi v aplikacijah, kjer je ponovna uporaba kode izrednega pomena.
Kako uporabljati predloge / izvedbo?
Predloge je mogoče izvajati na dva načina:
- Kot predloga funkcije
- Kot predloga predavanja
Predloga funkcije
Function Template je tako kot običajna funkcija, vendar je edina razlika v tem, da lahko normalna funkcija deluje samo na enem tipu podatkov, koda predloge funkcije pa na več podatkovnih tipih.
Čeprav lahko dejansko preobremenimo normalno funkcijo za delo na različnih vrstah podatkov, so predloge funkcij vedno bolj uporabne, saj moramo napisati edini program, ki lahko deluje na vseh podatkovnih tipih.
Nato bomo videli izvajanje predlog funkcije.
Splošna sintaksa predloge funkcije je:
template T function_name(T args){ …… //function body }
Tu je T argument predloge, ki sprejema različne vrste podatkov, razred pa je ključna beseda. Namesto razreda ključnih besed lahko napišemo tudi ‘typename’.
Ko se določenemu tipu podatkov posreduje ime-funkcije, prevajalnik naredi kopijo te funkcije s tem podatkovnim tipom kot argument in funkcija se izvrši.
Oglejmo si primer za boljše razumevanje funkcijskih predlog.
#include using namespace std; template void func_swap(T &arg1, T &arg2) { T temp; temp = arg1; arg1 = arg2; arg2 = temp; } int main() { int num1 = 10, num2 = 20; double d1 = 100.53, d2 = 435.54; char ch1 = 'A', ch2 = 'Z'; cout << 'Original data
'; cout << 'num1 = ' << num1 << ' num2 = ' << num2<Predloge za predavanja Tako kot v predlogah funkcij, bi lahko tudi mi zahtevali razred, ki je podoben vsem drugim vidikom, vendar le različne vrste podatkov.
V tem primeru imamo lahko različne razrede za različne vrste podatkov ali različno izvedbo za različne vrste podatkov v istem razredu. Toda s tem bo naša koda zajetna.
Najboljša rešitev za to je uporaba razreda predloge. Razred predloge se obnaša tudi podobno kot predloge funkcij. Med ustvarjanjem predmetov ali klicanjem funkcij člana moramo razredu predati podatkovni tip kot parameter.
Splošna sintaksa za predlogo predavanja je:
template class className{ ….. public: T memVar; T memFunction(T args); };
V zgornji definiciji T deluje kot ograda za podatkovni tip. Javni člani memVar in memFunction prav tako uporabljajo T kot ograda za tipe podatkov.
Ko je razred predloge opredeljen kot zgoraj, lahko predmete razreda ustvarimo na naslednji način:
className classObejct1; className classObject2; className classObject3;
Izvedimo primer kode za prikaz Predloge razredov:
#include using namespace std; template class myclass { T a, b; public: myclass (T first, T second) {a=first; b=second;} T getMaxval (); }; template T myclass::getMaxval () { return (a>b? a : b); } int main () { myclass myobject (100, 75); cout<<'Maximum of 100 and 75 = '< Izhod:
Največ 100 in 75 = 100
Največ „A“ in „a“ = a
Zgornji program izvaja primer predloge razreda. Imamo razred predloge myclass. Znotraj tega imamo konstruktor, ki bo inicializiral dva člana a in b razreda. Obstaja še ena funkcija člana getMaxval, ki je prav tako predloga funkcije, ki vrne največ a in b.
V glavni funkciji zgradimo dva predmeta, myobject vrste celo število in mychobject znaka tipa. Nato pokličemo funkcijo getMaxval za vsakega od teh predmetov, da določimo največjo vrednost.
Upoštevajte, da imajo lahko funkcije za predloge poleg parametrov tipa predloge (parametri tipa T) tudi običajne parametre, kot so običajne funkcije in tudi privzete vrednosti parametrov.
typename Vs. ključna beseda razreda
Med razglasitvijo razreda ali funkcije predloge uporabljamo eno od dveh ključnih besed razred ali ime tipa. Ti dve besedi sta pomensko enakovredni in se lahko uporabljata med seboj.
glasbeni video posnetki YouTube brezplačno prenesete programsko opremo
Toda v nekaterih primerih teh besed ne moremo uporabiti kot enakovredne. Na primer, kadar v predlogah, kot je “typedef”, uporabljamo odvisne tipe podatkov, namesto razreda uporabimo typename.
Ključno besedo class je treba uporabiti tudi, kadar moramo izrecno ustvariti primerek predloge.
Instantacija in specializacija predloge
Predloge so napisane na splošen način, kar pomeni, da gre za splošno izvedbo ne glede na vrsto podatkov. Glede na navedeni tip podatkov moramo za vsako vrsto podatkov ustvariti konkreten razred.
Na primer, če imamo algoritem za razvrščanje predloge, lahko ustvarimo konkreten razred za razvrščanje, drug razred za razvrščanje itd. To se imenuje instanciranje predloge.
V definiciji razreda predloge za parametre predloge nadomestimo argumente predloge (dejanski podatkovni tipi).
Na primer,
template class sort {};
Ko prenesemo podatkovni tip, prevajalnik podatkovni tip nadomesti z „T“, tako da algoritem za razvrščanje postane sortiranje.
Vsakič, ko uporabimo razred ali funkcijo predloge, je potreben primerek, ko posredujemo določen podatkovni tip. Če ta primerek še ni prisoten, ga prevajalnik ustvari z določenim podatkovnim tipom. To je implicitna instanca.
Ena pomanjkljivost implicitne instancije je, da prevajalnik generira razred primerka samo za argumente, ki se trenutno uporabljajo. To pomeni, da če želimo ustvariti knjižnico primerkov pred uporabo teh primerkov, moramo iti na eksplicitno instanciranje.
Primer izjave o predlogi je podan spodaj:
template class Array(T)
Lahko se izrecno ustvari kot:
template class Array
Ko se razred ustvari, se ustvarijo tudi vsi njegovi člani.
Specializacija za predloge
Med programiranjem s pomočjo predlog se lahko soočimo s takšno situacijo, da bomo morda potrebovali posebno izvedbo za določeno vrsto podatkov. Ko pride do take situacije, gremo na specializacijo za predloge.
Pri specializaciji predloge izvajamo posebno vedenje za določen tip podatkov, razen izvirne definicije predloge za druge vrste podatkov.
Na primer, razmislimo, da imamo razred predloge myIncrement ’ ki ima konstruktor za inicializacijo vrednosti in funkcije predloge toIncrement ki vrednost poveča za 1.
Ta razred bo odlično deloval za vse vrste podatkov, razen za char. Zakaj ne bi povečali vrednosti za char, zakaj mu ne bi dali posebnega vedenja in namesto tega znak pretvorili v velike črke?
Da bi to naredili, se lahko odločimo za specializacijo predloge za podatkovni tip char.
Ta izvedba je prikazana v spodnjem primeru kode.
#include using namespace std; // class template: template class myIncrement { T value; public: myIncrement (T arg) {value=arg;} T toIncrement () {return ++value;} }; // class template specialization: template class myIncrement { char value; public: myIncrement (char arg) {value=arg;} char uppercase () { if ((value>='a')&&(value<='z')) value+='A'-'a'; return value; } }; int main () { myIncrement myint (7); myIncrement mychar ('s'); myIncrement mydouble(11.0); cout<<'Incremented int value: '<< myint.toIncrement()<< endl; cout<<'Uppercase value: '< Izhod:
Priraščena vrednost int: 8
Velika črka: S
Povečana dvojna vrednost: 12

V zgornjem programu, ki prikazuje specializacijo predloge, si oglejte način, na katerega smo razglasili specializirano predlogo za tip char. Najprej prijavimo izvirni razred, nato pa ga 'specializiramo' za tip char. Za začetek specializacije uporabimo prazno deklaracijo predloge “template”.
Nato za imenom razreda vključimo vrsto podatkov. Po teh dveh spremembah je razred zapisan za tip char.
V glavni funkciji upoštevajte, da ni nobene razlike med primerkom tipa char in drugimi tipi. Edina razlika je v tem, da smo na novo opredelili specializirani razred.
Upoštevajte, da moramo definirati vse člane specializiranega razreda, čeprav so popolnoma enaki v razredu generične / izvirne predloge. To pa zato, ker nimamo funkcije dedovanja za člane od generične predloge do specializirane predloge.
C ++ Variadic Predloge
Do zdaj smo videli predloge funkcij, ki imajo določeno število argumentov. Obstajajo tudi predloge, ki zajemajo spremenljivo število argumentov. Te predloge funkcij se imenujejo variadne predloge. Variadne predloge so ena najnovejših lastnosti C ++ 11.
Variadne predloge zajemajo spremenljivo število argumentov, ki so varni za tip, argumenti pa so razrešeni v času prevajanja.
Vzemimo celoten primer programiranja, da to razumemo.
#include #include using namespace std; template T summation(T val) { return val; } template T summation(T first, Args... args) { return first + summation(args...); } int main() { long sum = summation(1, 2, 3, 8, 7); cout<<'Sum of long numbers = '<vprašanja in odgovori za testni vodnik pdf
Zgornji primer prikazuje variadno funkcijo, 'seštevanje'. Kot je prikazano zgoraj, najprej potrebujemo osnovno funkcijo, ki izvaja osnovni primer. Nato izvedemo variadic funkcijo na vrhu te funkcije.
V seštevanju spremenljivk funkcije se imenuje »typename… args« paket parametrov predloge ker se imenuje 'Args ... args' paket funkcijskih parametrov .
Po pisanju predloge funkcije, ki izvaja osnovni primer, napišemo različno funkcijo, ki implementira splošni primer. Variadična funkcija je zapisana podobno kot rekurzija, kot je prikazano za seštevanje (argumenti…). Prvi argument je ločen od paketa funkcijskih parametrov v tip T (prvi).
Z vsakim klicem seštevanja se seznam parametrov za en argument oži in sčasoma je dosežen osnovni pogoj. Rezultat prikazuje vsoto dolgih celih števil in znakov.
Zaključek
S tem zaključujemo to vadnico o predlogah v jeziku C ++. Predloge nam pomagajo, da naše programe naredimo generične, torej neodvisne od vrste.
Preberite tudi = >> Vadnica za bučke
Splošni programi so vedno na vrhu drugih programov, saj nam ni treba pisati ločenih programov za vsako podatkovno vrsto. Tako je lahko razvoj generično varnih programov pomemben korak k učinkovitemu programiranju.
=> Tukaj preverite vadnice za globoko učenje C ++.
Priporočeno branje
- Vadnica za glavne funkcije Pythona s praktičnimi primeri
- Kako deluje preskušanje na podlagi podatkov (primera QTP in selena)
- Večnitnost v jeziku C ++ z primeri
- Vadnica Python DateTime s primeri
- Vzorčna predloga testnega primera s primeri testnega primera (prenos)
- Izreži ukaz v Unixu s primeri
- Vzorčna predloga za poročilo o preizkusu sprejemljivosti s primeri
- Sintaksa ukaza Unix Cat, možnosti s primeri