20:33 Ստանդարտ գրադարանը իր մեջ ներառում է հետևյալ բաժինները՝ |
Ստանդարտ գրադարանը իր մեջ ներառում է հետևյալ բաժինները՝ Լեզվի աջակցությունը։ Ներառում է ծրագրի աշխատանքի համար անհրաժեշտ միջոցներ, ինչպես նաև իրականացման առանձնահատկությունների մասին մանրամասները։ Հիշողության հատկացումը, RTTI-ն, հիմնական բացառությունները, տվյալների թվային տիպերի համար արժեքների սահմանները, միջավայրի հետ փոխազդեցության հիմնական միջոցները, ինչպիսիք են համակարգի ժամը, UNIX-ի ազդանշանների մշակումը, ծրագրի ավարտումը։ Ստանդարտ կոնտեյներները։ Ստանդարտ գրադարանի մեջ են մտնում հետևյալ կոնտեյներների համար կաղապարները՝ միաչափ զանգվածները, ցանկերը, մեկ- և երկուղղված հերթերը, սթեքերը, ասոցիացվող զանգվածները, բազմությունները, առաջնահերթություններով հերթերը։ Հիմնական օժանդակ ծրագրերը։ Այս բաժնի մեջ են մտնում ստանդարտ գրադարանում կիրառվող հիմնական տարրերի նկարագրումը, հիշողության հատկացնողները և С լեզվի ոճով ժամանակի աջակցությունը։ Իտերատորները։ Ապահովում է իտերատորների կաղապարները, որոնց օգնությամբ ստանդարտ գրադարանում իրականացվում է կոնտեյներների տարրերին տվյալների մշակման ալգորիթմների խմբավորված կիրառման ստանդարտ մեխանիզմը։ Ալգորիթմները։ Մշակման գործողությունների նկարագրման կաղապարներ, որոնք ստանդարտ գրադարանի մեխանիզմների օգնությամբ կարող են կիրառվել տարրերի ցանկացած հաջորդականությամբ վրա, այդ թվում կոնտեյներների տարրերի։ Այս բաժնի մեջ են մտնում նաև C լեզվի ստանդարտ գրադարանի bsearch() և qsort() ֆունկցիաների նկարագրությունները։ Տողերը։ C++-ի ոճով տողերի կաղապարներ։ Այս բաժնի մեջ են մտնում նաև C լեզվի ոճով տողերի և նշանների հետ աշխատանքի գրադարանի մի մասը։ Մուտքը և ելքը։ Կաղապարներ և օգնող դասեր ընդհանուր տեսքի մուտքի ելքի հոսքի, տողային մուտքի-ելքի հոսքի, մանիպուլյատորների ( C++-ի ոճով հոսքային մուտքի-ելքի ձևաչափի կառավարման միջոցներ) համար։ Տեղայնացումը։ Սահմանումներ, որոնք օգտագործվում են С++-ի և C-ի ոճով ներկայացման ազգային առանձնահատկությունների և ձևաչափերի աջակցման համար։ Դիագնոստիկան։ Բացառությունների շարքերի և կատարման ժամանակ պնդումների ստուգման մեխանիզմների (assert) սահմանումներ։ Սխալների մշակման աջակցում C-ի ոճով։ Թվերը։ Կոմպլեքս թվերի, մաթեմատիկական վեկտորների աշխատանքի համար սահմանումներ, ընդհանուր մաթեմատիկական ֆունկցիաների աջակցում, պատահական թվերի գեներատոր։ Կոնտեյներները, տողերը, ալգորիթմները, իտերատորները և հիմնական օժանդակ ծրագրերը, բացառությամբ C-ի գրադարանից վերցվածների, միասին անվանում են STL (Stanard Template Library, ստանդարտ կաղապարային գրադարան)։ Ի սկզբանե այս գրադարանը առանձին է եղել և նրա հապավումը այլ ձևով էր ընդլայնվում, սակայն հետագայում այն մտավ C++-ի ստանդարտ գրադարանի մեջ՝ որպես նրա անբաժաների մաս։ Անվան մեջ արտացոլված է այն, որ ընդհանուր տեսքի միջոցների (կոնտեյներների, տողերի, ալգորիթմների) իրականացման համար օգտագործված են ընդհանրացված ծրագրավորման մեխանիզմները (C++-ի կաղապարները՝ template)։ Ստրաուստրուպի աշխատանքներում մանրամասն նկարագրված են այն պատճառները, որոնց համար հենց այդպիսի ընտրություն է կատարվել։ Հիմնական պատճառը ընտրված լուծման մեծ ունիվերսալությունն է (կաղապարային կոնտեյներները, ի տարբերություն օբյեկտայինների, կարող են հեշտությամբ օգտագործվել ոչ օբյեկտային տիպերի համար և չեն պահանջում այդ տարրերի ընդհանուր նախնիի առկայությունը) և նրա տեխնիկական արդյունավետությունը (որպես կանոն, կաղապարային կոնտեյների գործողությունները չեն պահանջում վիրտուալ ֆունկցիաների կանչեր և կարող են հեշտությամբ ներկառուցվել (inline), ինչն արդյունքում տալիս է այնպիսի արդյունավետ կոդ, ինչպիսին կլիներ ձեռքով կոդավորման ժամանակ)։ Իրականացումները STL-ը, մինչև C++-ի ստանդարտին միանալը, իրենից ներկայացրել է երկրորդական մշակում, սկզբում HP ընկերության, այնուհետև՝ SGI։ Լեզվի ստանդարտը այն «STL» չի անվանում, քանի որ այդ գրադարանը դարձել է լեզվի անբաժանելի մասը, սակայն շատերը մինչև այսօր էլ օգտագործում են այդ անվանումը, որպեսզի այն տարբերեն ստանդարտ գրադարանի մնացած մասին (մուտքի-ելքի հոսքերը (iostream), C-ի ենթաբաժինը և այլն)։ STLport անվանումով նախագիծը[11], որն հիմնված է SGI STL-ի վրա, իրականացնում է STL-ի, IOstream-ի և տողային դասերի մշտական թարմացումը։ Որոշ այլ նախագծեր նույնպես զբաղվում են ստանդարտ գրադարանի մասնավոր կիրառումների մշակմամբ։ C լեզվի հետ համատեղելիությունը Նոր հնարավորությունները C++ լեզվի նոր հնարավորությունները, որոնք բացակայում էին C լեզվում՝ օբյեկտային կողմնորոշված ծրագրավորման աջակցում, ընդհանրացված ծրագրավորման աջակցություն կաղապարների միջոցով, լրացուցիչ տվյալների տիպեր, բացառություններ, անվանատարածքներ, ներկառուցվող ֆունկցիաներ, օպերատորների վերբեռնում, ֆունկցիաների անունների վերբեռնում, հղումներ և ազատ տեղակայված հիշողության կառավարման օպերատորներ, ստանդարտ գրադարանի լրացումներ։ C++-ի նոր հնարավորությունները ներառում են արտահայտությունների տեսքով հայտարարությունները, ֆունկցիաների տեսքով տիպերի փոխարկումները, new և delete օպերատորները, bool տիպը, հղումները, հաստատունության ընհանրացված հասկացությունը, inline-ֆունկցիաները, լռելյան արգումենտները, վերասահմանումները, անվանատարածքները, դասերը (այդ թվում և դասերի հետ կապված բոլոր հնարավորությունները, ինչպիսիք են ժառանգումը, ֆունկցիա-անդամները, վիրտուալ ֆունկցիաները, աբստրակտ ֆունկցիաները և կառուցողները), օպերատորների վերասահմանումները, կաղապարները, :: օպերատորը, բացառությունների մշակումը, դինամիկ նույնականացումը և այլ հնարավորություններ։ C++ լեզուն շատ դեպքերում նաև ավելի խիստ է վերաբերվում տիպերի ստուգմանը, քան C-ն։ C++-ում նոր մեկնաբանություններ են հայտնվել երկու գծերի տեսքով (//), որոնք եղել են C-ի նախորդի մոտ՝ BCPL լեզվում։ C++ լեզվի որոշ առանձնահատկություններ ավելի ուշ տեղափոխվել են C լեզու, օրինակ, const և inline բանալի բառերը, for ցիկլերում հայտարարումը և C++-ի ոճով մեկնաբանությունները (//)։ Ավելի C-ի հետագա իրականացումներում ներկայացված էին նաև այնպիսի հնարավորություններ, որոնք չկան C++-ում, օրինակ va_arg մակրոսները և զանգված-պարամետրերի հետ բարելավված աշխատանքը։ C++-ը իր մեջ չի ներառում C-ն Չնայած նրան, որ C լեզվով գրված կոդի մեծ մասը կաշխատի նաև C++-ում, վերջինս իր մեջ չի ներառում C լեզուն։ Գոյություն ունի նաև C լեզվի համար աշխատող այնպիսի կոդ, որը չի աշխատում C++-ում։ Սա է C++-ի տարբերությունը Objective C-ից՝ C լեզվի օբյեկտային կողմնորոշված ծրագրավորման ևս մեկ բարելավում, որն հենց ամբողջությամբ ներառում է C լեզուն։ Գոյություն ունեն նաև ուրիշ տարբերություններ։ Օրինակ, C++-ը չի թույլատրում կանչել main() ֆունկցիան ծրագրի ներսում, այն ժամանակ, երբ C-ում այդ գործողությունը թույլատրվում է։ Բացի այդ, C++-ն որոշ հարցերում ավելի խիստ է․ օրինակ, այն չի թույլատրում դեռևս չհայտարարված ֆունկցիաների օգատգործումը։ Ավելին, կոդը, որը ճիշտ է երկու լեզուների համար էլ, կարող է տալ տարբեր արդյունքներ, կախված, թե որ լեզվի կոմպիլյատորով է այն կոմպիլյացված։ Օրինակ, հարթակների մեծամասնությունում ստորև բերված ծրագիրը տպում է «C», եթե կոմպիլյացվում է C-ի կոմպիլյատորով, և «C++»՝ C++-ի կոմպիլյատորով։ Այսպես տեղի է ունենում այն պատճառով, որ C-ում սիմվոլային հաստատունները (օրինակ, 'a'-ն) ունեն int տիպ, իսկ C++-ում՝ char տիպ, իսկ այդ տիպերի չափսերը սովորաբար տարբերվում են միմյանցից։ #include <stdio.h> int main() { printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C"); return 0; } Ծրագրերի օրինակներ Ստորև ներկայացված են C++ ծրագրավորման լեզվով գրված ծրագրերի կոդեր՝ իրենց բացատրություններով։ Օրինակ № 1 Սա մի ծրագրի օրինակ է, որը ոչինչ չի անում։ Այն սկսում է կատարվել և անմիջապես դադարեցնում է աշխատանքը։ Այն կազմված է հիմնական հոսքից՝ main() ֆունկցիայից, որն հանդիսանում է C++ ծրագրի կատարման սկզբնական կետ։ int main() { return 0; } C++–ի ստանդարտը պահանջում է, որ main() ֆունկցիան վերադարձնի int տիպ։ Այն ծրագիրը, որի main() ֆունկցիան վերադարձնում է այլ տիպի արժեք, չի համապատասխանում C++–ի ստանդարտին։ Ստանդարտը չի ասում, թե ինչ է իրականում նշանակում main() ֆունկցիայի վերադարձվող արժեք ասվածը։ Ավանդաբար համարում են, որ այն վերադարձնում է ծրագրի կոդը։ Ստանդարտն երաշխավորում է, որ եթե main() ֆունկցիան վերադարձնում է 0 արժեք, ապա ծրագրի կատարումն ավարտվել է հաջողությամբ։ C++–ով գրված ծրագրի աշխատանքի սխալով ավարտումը ավանդաբար նշանակում է ոչ զրոյական արժեքի վերադարձ։ Օրինակ № 2 Այս ծրագիրը նույնպես ոչինչ չի անում, բայց ավելի հակիրճ է։ int main(){} C++–ում (ինչպես և C–ում), եթե ծրագրի կատարումը հասնում է main() ֆունկցիայի ավարտին, ապա այն համարժեք է return 0;–ին։ Դա ճիշտ է միայն main() ֆունկցիայի համար։ Օրինակ № 3 Սա Hello, world! ծրագրի օրինակ է, որն արտարծում է հաղորդագրություն՝ օգտագործելով ստանդարտ գրադարանը, և ավարտում է աշխատանքը։ // սա միացնում է iostream գլխագիր ֆայլը #include <iostream> using namespace std; int main() { cout << "Hello, world!" << endl; // endl–ի փոխարեն կարելի է գրել նաև "...\n" return 0; } Օրինակ № 4 Ժամանակակից C++ –ը թույլ է տալիս պարզ եղանակով լուծել ավելի բարդ խնդիրներ։ Այս օրինակը, ամեն ինչից զատ, ցուցադրում է կաղապարների ստանդարտ գրադարանի (STL) կոնտեյներների օգտագործումը։ #include <iostream> // std::cout–ի օգտագործման համար #include <vector> // std::vector<>–ի համար #include <map> // std::map<>–ի և std::pair<>–ի համար #include <algorithm> // std::for_each()–ի համար #include <string> // std::string–ի համար using namespace std; // օգտագործում ենք "std" անվանատարածքը void display_item_count(pair < string const, vector<string> > const& person) { // person–ը երկու օբյեկտների զույգ է՝ person.first–ը նրա անունն է, // person.second–ը՝ նրա առարկաների քանակը (տողերի վեկտոր) cout << person.first << " is carrying " << person.second.size() << " items" << endl; } int main() { // Հայտարարում ենք տողային բանալիներով և վեկտորային տողերի տեսքի տվյալներով քարտեզը map< string, vector<string> > items; // Ավելացնում ենք այդ քարտեզում մի քանի անձի և տալիս ենք նրանց մի քանի առարկաներ items["Ani"].push_back("scarf"); items["Davit"].push_back("tickets"); items["Ani"].push_back("puppy"); // Կրկնում ենք բոլոր օբյեկտներն կոնտեյներում for_each(items.begin(), items.end(), display_item_count); } Այս օրինակում պարզության համար օգտագործվում է անվանատարածքի օգտագործման դիրեկտիվ։ Իրական ծրագրում հաճախ խորհուրդ է տրվում օգտագործել հայտարարություններ, որոնք դիրեկտիվներից ավելի կոկիկ են՝ #include <vector> int main() { using std::vector; vector<int> my_vector; } Այստեղ դիրեկտիվը տեղադրված է ֆունկցիայի հատվածում, ինչը նվազեցնում է անունների միջև հնարավոր անհամաձայնությունները (ինչն էլ հենց պատճառ է հանդիսացել ծրագրավորման լեզուներում անվանատարածքների ներմուծման)։ Այնպիսի հայտարարությունների օգտագործումը, որոնք միավորում են տարբեր անվանատարածքներ մեկի մեջ, հակասում է անվանատարածքների օգտագործման հասկացությանը։ Օրինակ № 5 boost հանրահայտ գրադարանները լեզվի ստանդարտ միջոցների հետ համադրությամբ թույլ են տալիս շատ հակիրճ և ընկալելի գրել կոդը։ Ստորև բերված օրինակում հաշվվում է կենտ թվերի և իրենց քառակուսիների վեկտորների սկալյար արտադրյալը։ Կոդում արժեքները վեկտորները տրված են ծույլ STL–անման հաջորդականություններով։ #include <iostream> #include <numeric> #include <boost/iterator/counting_iterator.hpp> #include <boost/iterator/transform_iterator.hpp> int odd(int i) { return 2 * i + 1; } int square(int i) { return i * i; } typedef boost::counting_iterator <int> counter; typedef boost::transform_iterator <int (*)(int), counter> transformer; transformer odds(int n) { return transformer(counter(n), odd); } transformer squares(int n) { return transformer(counter(n), square); } int main() { using namespace std; cout << "Enter vector length: "; int n; cin >> n; cout << inner_product( odds(0), odds(n), squares(0), 0 ) << endl; } Այս օրինակը ցուցադրում է կոդի գրառման, այսպես կոչված, «հարթ» ոճը։ Այս անվանումը կապված է այն բանի հետ, որ STL ալգորիթմները թույլ են տալիս գրառել կոդն առանց ցիկլերի, հետևաբար տողասկզբի հեռավորության երկարությունը ձևավորված կոդում համարյա թե հաստատուն է։ Այսպիսի մոտեցման կողմնակիցները համարում են, որ C++–ի ստանդարտ գրադարանին ծանոթ ծրագրավորողին բավական է միայն inner_product()–ի կանչով տողեր, որպեսզի նա հասկանա, ինչ է անում ծրագիրը։ Ըստ այս տեսակետի, inner_product–ի կանչը նման է առաջադրանքի բառացի նկարագրմանը… «հաշվել կենտ թվերի և իրենց քառակուսիների վեկտորների սկալյար արտադրյալը զրոյից n արժեքների համար»: |
|
Մեկնաբանություններն ընդամենը՝: 0 | |