Задача этой книги дать краткое и четкое изложение языка С++ в соответствии со стандар том iso/iec 14882. Она предназначена для студентов, изучающих язык «с нуля»



Download 2 Mb.
bet178/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   174   175   176   177   178   179   180   181   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Списки (list)


Cïèñîê íå ïðåäîñòaâëяåò ïðîèçâîëüíîãî äîñòóïa ê ñâîèì ýëåìåíòaì, çaòî âñòaâ- êa è óäaëåíèå âûïîëíяþòñя ça ïîñòîяííîå âðåìя. Êëaññ list ðåaëèçîâaí â STL â âèäå äâóñâяçíîãî ñïèñêa, êaæäûé óçåë êîòîðîãî ñîäåðæèò ññûëêè ía ïîñëåäóþ- ùèé è ïðåäûäóùèé ýëåìåíòû. Ïîýòîìó îïåðaöèè èíêðåìåíòa è äåêðåìåíòa äëя èòåðaòîðîâ ñïèñêa âûïîëíяþòñя ça ïîñòîяííîå âðåìя, a ïåðåäâèæåíèå ía n óçëîâ òðåáóåò âðåìåíè, ïðîïîðöèîíaëüíîãî n.
Ïîñëå âûïîëíåíèя îïåðaöèé âñòaâêè è óäaëåíèя çía÷åíèя âñåõ èòåðaòîðîâ è ññûëîê îñòaþòñя äåéñòâèòåëüíûìè.
Cïèñîê ïîääåðæèâaåò nîíñòðónòîðû, îïåðaöèþ ïðèñâaèâaíèя, ôóínöèþ nîïè- ðîâaíèя, îïåðaöèè ñðaâíåíèя è èòåðaòîðû, aíaëîãè÷íûå âåêòîðaì è î÷åðåäяì.
Äîñòóï n ýëåìåíòaì äëя ñïèñêîâ îãðaíè÷èâaåòñя ñëåäóþùèìè ìåòîäaìè:
referenCe frOnt(); COnst_referenCe frOnt() COnst; referenCe baCk(); COnst_referenCe baCk() COnst;
Äëя çaíåñåíèя â ía÷aëî è nîíåö ñïèñêa îïðåäåëåíû ìåòîäû, aíaëîãè÷íûå ñîîò- âåòñòâóþùèì ìåòîäaì î÷åðåäè:
vOid push_frOnt(COnst T& value); vOid pOp_frOnt();
vOid push_baCk(COnst T& value);

vOid pOp_baCk();


Êðîìå òîãî, äåéñòâóþò âñå îñòaëüíûå ìåòîäû äëя èçìåíåíèя îáúånòîâ list, aía- ëîãè÷íûå âåêòîðaì è î÷åðåäяì:
iteratOr insert(iteratOr pOsitiOn, COnst T& value);
vOid insert(iteratOr pOsitiOn, size_type n, COnst T& value); template
vOid insert(iteratOr pOsitiOn, InputIter first, InputIter last); iteratOr erase(iteratOr pOsitiOn);
iteratOr erase(iteratOr first, iteratOr last); vOid swap();
vOid Clear();
Äëя ñïèñêa íå îïðåäåëåía ôóíêöèя CapaCity, ïîñêîëüêó ïaìяòü ïîä ýëåìåíòû îò- âîäèòñя ïî ìåðå íåîáõîäèìîñòè. Ìîæíî èçìåíèòü ðaçìåð ñïèñêa, óäaëèâ èëè äî- áaâèâ ýëåìåíòû â êîíåö ñïèñêa (aíaëîãè÷íî äâóñòîðîííåé î÷åðåäè):
vOid resize(size_type sz,TC= T());
Êðîìå ïåðå÷èñëåííûõ, äëя ñïèñêîâ îïðåäåëåíî íåñêîëüêî ñïåöèôè÷åñêèõ ìåòî- äîâ. Ñöåïna ñïèñnîâ (spliCe) ñëóæèò äëя ïåðåìåùåíèя ýëåìåíòîâ èç îäíîãî ñïè- ñêa â äðóãîé áåç ïåðåðañïðåäåëåíèя ïaìяòè, òîëüêî ça ñ÷åò èçìåíåíèя óêaçaòå- ëåé:
vOid spliCe(iteratOr pOsitiOn, list& x);
vOid spliCe(iteratOr pOsitiOn, list& x, iteratOr i);
vOid spliCe(iteratOr pOsitiOn, list& x, iteratOr first, iteratOr last);
Îáa ñïèñêa äîëæíû ñîäåðæaòü ýëåìåíòû îäíîãî òèïa. Ïåðâaя ôîðìa ôóíêöèè âñòaâëяåò â âûçûâaþùèé ñïèñîê ïåðåä ýëåìåíòîì, ïîçèöèя êîòîðîãî óêaçaía ïåðâûì ïaðaìåòðîì, âñå ýëåìåíòû ñïèñêa, óêaçaííîãî âòîðûì ïaðaìåòðîì, ía- ïðèìåð:
list L1, L2;
… // Ôîðìèðîâaíèå ñïèñêîâ L1.spliCe(L1.begin() + 4, L2);
Âòîðîé ñïèñîê îñòaåòñя ïóñòûì. Íåëüçя âñòaâèòü ñïèñîê â ñaìîãî ñåáя.
Âòîðaя ôîðìa ôóíêöèè ïåðåíîñèò ýëåìåíò, ïîçèöèþ êîòîðîãî îïðåäåëяåò òðåòèé ïaðaìåòð, èç ñïèñêa x â âûçûâaþùèé ñïèñîê. Äîïóñêaåòñя ïåðåíîñèòü ýëåìåíò â ïðåäåëaõ îäíîãî ñïèñêa.
Òðåòüя ôîðìa ôóíêöèè aíaëîãè÷íûì îáðaçîì ïåðåíîñèò èç ñïèñêa â ñïèñîê íå- ñêîëüêî ýëåìåíòîâ. Èõ äèaïaçîí çaäaåòñя òðåòüèì è ÷åòâåðòûì ïaðaìåòðaìè ôóíêöèè. Åñëè äëя îäíîãî è òîãî æå ñïèñêa ïåðâûé ïaðaìåòð íaõîäèòñя â äèaïa- çîíå ìåæäó òðåòüèì è ÷åòâåðòûì, ðåçóëüòaò íå îïðåäåëåí. Ïðèìåð:
inClude using namespaCe std; int main(){
list L1; list::iteratOr i, j, k;
fOr (inti= 0; i<5; i++)L1.push_baCk(i + 1); fOr (int i = 12; i<14; i++)L1.push_baCk(i);

COut << "Èñõîäíûé ñïèñîê: ";


fOr (i = L1.begin(); i != L1.end(); ++i)COut << *i << " "; COut << endl;
i = L1.begin(); i++; k = L1.end();
j = --k; k++; j--;
L1.spliCe( i, L1, j, k);
COut << "Cïèñîê ïîñëå ñöåïêè: ";
fOr(i= L1.begin(); i != L1.end(); ++i) COut << *i << " ";
}
Ðåçóëüòaò ðaáîòû ïðîãðaììû:
Èñõîäíûé ñïèñîê:12345 12 13
Cïèñîê ïîñëå ñöåïêè: 1 12 13 2345
Ïåðåìåùåííûå ýëåìåíòû âûäåëåíû ïîëóæèðíûì øðèôòîì. Îáðaòèòå âíèìaíèå,
÷òî äëя èòåðaòîðîâ ñïèñêîâ íå îïðåäåëåíû îïåðaöèè ñëîæåíèя è âû÷èòaíèя, òî åñòü íåëüçя íaïèñaòü j=k– 1, ïîýòîìó ïðèøëîñü âîñïîëüçîâaòüñя äîïóñòèìûìè äëя èòåðaòîðîâ ñïèñêîâ îïåðaöèяìè èíêðåìåíòa è äåêðåìåíòa.  îáùåì ñëó÷aå äëя ïîèñêa ýëåìåíòa â ñïèñêå èñïîëüçóåòñя ôóíêöèя find (ñì. ñ. 346).
Äëя óäaëåíèя ýëåìåíòa ïî åãî çía÷åíèþ ïðèìåíяåòñя ôóíêöèя remOve: vOid remOve(COnst T& value);
Åñëè ýëåìåíòîâ ñî çía÷åíèåì value â ñïèñêå íåñêîëüêî, âñå îíè áóäóò óäaëåíû.
Ìîæíî óäaëèòü èç ñïèñêa ýëåìåíòû, óäîâëåòâîðяþùèå íåêîòîðîìó óñëîâèþ. Äëя ýòîãî èñïîëüçóåòñя ôóíêöèя remOve_if:
template vOid remOve_if(PrediCate pred);
Ïaðaìåòðîì яâëяåòñя êëaññ-ïðåäèêaò, çaäaþùèé óñëîâèå, íaêëaäûâaåìîå ía ýëå- ìåíò ñïèñêa. Î ïðåäèêaòaõ ñì. ñ. 336.
Äëя óïîðяäî÷èâaíèя ýëåìåíòîâ ñïèñêa èñïîëüçóåòñя ìåòîä sOrt: vOid sOrt();
template vOid sOrt(COmpare COmp);
 ïåðâîì ñëó÷aå ñïèñîê ñîðòèðóåòñя ïî âîçðañòaíèþ ýëåìåíòîâ (â ñîîòâåòñòâèè ñ îïðåäåëåíèåì îïåðaöèè < äëя ýëåìåíòîâ), âî âòîðîì — â ñîîòâåòñòâèè ñ ôóíê- öèîíaëüíûì îáúåêòîì COmpare (î ôóíêöèîíaëüíûõ îáúåêòaõ ðaññêaçûâaëîñü â ðaçäåëå «Ïåðåãðóçêa îïåðaöèè âûçîâa ôóíêöèè» ía ñ. 195). Ôóíêöèîíaëüíûé îáúåêò èìååò çía÷åíèå true, åñëè äâa ïåðåäaâaåìûõ åìó çía÷åíèя äîëæíû ïðè ñîðòèðîâêå îñòaòüñя â ïðåæíåì ïîðяäêå, è false — â ïðîòèâíîì ñëó÷aå.
Ïîðяäîê ñëåäîâaíèя ýëåìåíòîâ, èìåþùèõ îäèíaêîâûå çía÷åíèя, ñîõðaíяåòñя. Âðåìя ñîðòèðîâêè ïðîïîðöèîíaëüíî N·log2N, ãäå N — êîëè÷åñòâî ýëåìåíòîâ â ñïèñêå.
Ìåòîä unique îñòaâëяåò â ñïèñêå òîëüêî ïåðâûé ýëåìåíò èç êaæäîé ñåðèè èäóùèõ ïîäðяä îäèíaêîâûõ ýëåìåíòîâ. Ïåðâaя ôîðìa ìåòîäa èìååò ñëåäóþùèé ôîðìaò:
vOid unique();

Âòîðaя ôîðìa ìåòîäa unique èñïîëüçóåò â êa÷åñòâå ïaðaìåòða áèíaðíûé ïðåäèêaò (ñì. ñ. 336), ÷òî ïîçâîëяåò çaäaòü ñîáñòâåííûé êðèòåðèé óäaëåíèя ýëåìåíòîâ ñïèñêa. Ïðåäèêaò èìååò çía÷åíèå true, åñëè êðèòåðèé ñîáëþäåí, è false — â ïðî- òèâíîì ñëó÷aå. Àðãóìåíòû ïðåäèêaòa èìåþò òèï ýëåìåíòîâ ñïèñêa:


template
vOid unique(BinaryPrediCate binary_pred);
Äëя ñëèяíèя ñïèñnîâ ñëóæèò ìåòîä merge: vOid merge(list& x);
template vOid merge(list& x, COmpare COmp);
Îáa ñïèñêa äîëæíû áûòü óïîðяäî÷åíû (â ïåðâîì ñëó÷aå â ñîîòâåòñòâèè ñ îïðåäå- ëåíèåì îïåðaöèè < äëя ýëåìåíòîâ, âî âòîðîì — â ñîîòâåòñòâèè ñ ôóíêöèîíaëü- íûì îáúåêòîì COmpare). Ðåçóëüòaò — óïîðяäî÷åííûé ñïèñîê. Åñëè ýëåìåíòû â âûçûâaþùåì ñïèñêå è â ñïèñêå-ïaðaìåòðå ñîâïaäaþò, ïåðâûìè áóäóò ðañïîëa- ãaòüñя ýëåìåíòû èç âûçûâaþùåãî ñïèñêa.
Ìåòîä reverse ñëóæèò äëя èçìåíåíèя ïîðяäna ñëåäîâaíèя ýëåìåíòîâ ñïèñêa ía îáðaòíûé (âðåìя ðaáîòû ïðîïîðöèîíaëüíî êîëè÷åñòâó ýëåìåíòîâ):
vOid reverse();
Ïðèìåð ðaáîòû ñî ñïèñêîì:
inClude inClude
using namespaCe std;
vOid shOw (COnst Char *str, COnst list &L){ COut << str << ":" << endl;
fOr (list::COnst_iteratOr i = L.begin(); i != L.end(); ++i) COut << *i << " ";
COut << endl;
}
int main(){ list L;
list::iteratOr i; int x;
ifstream in("inpnum");
while ( in >> x, !in.eOf()) L.push_baCk(x); shOw("Èñõîäíûé ñïèñîê", L); L.push_frOnt(1);
i = L.begin(); L.insert(++i, 2); shOw("Ïîñëå âñòaâêè1è2â ía÷aëî", L); i = L.end(); L.insert(--i, 100);
shOw("Ïîñëå âñòaâêè 100 ïåðåä ïîñëåäíèì", L); i = L.begin(); x = *i; L.pOp_frOnt();
COut << "Óäaëèëè èç ía÷aëa" << x << endl; i = L.end(); x = *--i; L.pOp_baCk(); COut << "Óäaëèëè ñ êîíöa" << x << endl; shOw("Cïèñîê ïîñëå óäaëåíèя", L); L.remOve(76);

shOw("Ïîñëå óäaëåíèя ýëåìåíòîâ ñî çía÷åíèåì 76", L); L.sOrt();


shOw("Ïîñëå ñîðòèðîâêè", L); L.unique();
shOw("Ïîñëå unique", L); list L1 (L); L.reverse();
shOw("Ïîñëå reverse", L);
}
Ðåçóëüòaò ðaáîòû ïðîãðaììû:
Èñõîäíûé ñïèñîê:
56 34 540 76 23 51 11 51 11 76 88
Ïîñëå âñòaâêè1è2â ía÷aëî:
12 56 34 540 76 23 51 11 51 11 76 88
Ïîñëå âñòaâêè 100 ïåðåä ïîñëåäíèì:
12 56 34 540 76 23 51 11 51 11 76 100 88
Óäaëèëè èç ía÷aëa 1 Óäaëèëè ñ êîíöa 88 Cïèñîê ïîñëå óäaëåíèя:
2 56 34 540 76 23 51 11 51 11 76 100
Ïîñëå óäaëåíèя ýëåìåíòîâ ñî çía÷åíèåì 76:
2 56 34 540 23 51 11 51 11 100
Ïîñëå ñîðòèðîâêè:
02 11 11 23 34 51 51 54 56 100
Ïîñëå unique:
02 11 23 34 51 54 56 100
Ïîñëå reverse:
100 56 54 51 34 23 11 2 0
Ê ñïèñêaì ìîæíî ïðèìåíяòü aëãîðèòìû ñòaíäaðòíîé áèáëèîòåêè, îïèñaííûå â ðaçäåëå «Àëãîðèòìû» (ñ. 343).



Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   174   175   176   177   178   179   180   181   ...   232




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish