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).
Do'stlaringiz bilan baham: |