Äâóñòîðîííяя î÷åðåäü — ýòî ïîñëåäîâaòåëüíûé êîíòåéíåð, êîòîðûé, íaðяäó ñ âåê- òîðîì, ïîääåðæèâaåò ïðîèçâîëüíûé äîñòóï ê ýëåìåíòaì è îáåñïå÷èâaåò âñòaâêó è óäaëåíèå èç îáîèõ êîíöîâ î÷åðåäè ça ïîñòîяííîå âðåìя. Òå æå îïåðaöèè ñ ýëåìåí- òaìè âíóòðè î÷åðåäè çaíèìaþò âðåìя, ïðîïîðöèîíaëüíîå êîëè÷åñòâó ïåðåìåùaå- ìûõ ýëåìåíòîâ. Ðañïðåäåëåíèå ïaìяòè âûïîëíяåòñя aâòîìaòè÷åñêè.
Ðaññìîòðèì ñõåìó îðãaíèçaöèè î÷åðåäè (ðèñ. 12.1). Äëя òîãî ÷òîáû îáåñïå÷èòü ïðîèçâîëüíûé äîñòóï ê ýëåìåíòaì ça ïîñòîяííîå âðåìя, î÷åðåäü ðaçáèòa ía áëî- êè, äîñòóï ê êaæäîìó èç êîòîðûõ îñóùåñòâëяåòñя ÷åðåç óêaçaòåëü. Ía ðèñóíêå ça- êðaøåííûå îáëañòè ñîîòâåòñòâóþò çaíяòûì ýëåìåíòaì î÷åðåäè. Åñëè ïðè äîáaâ- ëåíèè â ía÷aëî èëè â êîíåö áëîê îêaçûâaåòñя çaïîëíåííûì, âûäåëяåòñя ïaìяòü ïîä î÷åðåäíîé áëîê (íaïðèìåð, ïîñëå çaïîëíåíèя áëîêa 4 áóäåò âûäåëåía ïaìяòü ïîä áëîê 5, a ïîñëå çaïîëíåíèя áëîêa 2 — ïîä áëîê 1). Ïðè çaïîëíåíèè êðaéíåãî èç áëîêîâ ïðîèñõîäèò ïåðåðañïðåäåëåíèå ïaìяòè ïîä ìaññèâ óêaçaòåëåé òaê, ÷òî- áû èñïîëüçîâaëèñü òîëüêî ñðåäíèå ýëåìåíòû. Ýòî íå çaíèìaåò ìíîãî âðåìåíè.
Òaêèì îáðaçîì, äîñòóï ê ýëåìåíòaì î÷åðåäè îñóùåñòâëяåòñя ça ïîñòîяííîå âðå- ìя, õîòя îíî è íåñêîëüêî áîëüøå, ÷åì äëя âåêòîða.
0
1
2
3
4
5
6
Рис. 12.1. Организация двусторонней очереди
Äëя ñîçäaíèя äâóñòîðîííåé î÷åðåäè ìîæíî âîñïîëüçîâaòüñя ñëåäóþùèìè nîíñò- ðónòîðaìè (ïðèâåäåía óïðîùåííaя çaïèñü), aíaëîãè÷íûìè êîíñòðóêòîðaì âåê- òîða:
expliCit deque(); // 1
expliCit deque(size_type n, COnst T& value = T()); // 2 template // 3
deque(InputIter first, InputIter last);
deque(COnst veCtOr& x); // 4
Êîíñòðóêòîð 1 яâëяåòñя êîíñòðóêòîðîì ïî óìîë÷aíèþ.
Êîíñòðóêòîð 2 ñîçäaåò î÷åðåäü äëèíîé n è çaïîëíяåò åå îäèíaêîâûìè ýëåìåíòa- ìè — êîïèяìè value.
Êîíñòðóêòîð 3 ñîçäaåò î÷åðåäü ïóòåì êîïèðîâaíèя óêaçaííîãî ñ ïîìîùüþ èòåða- òîðîâ äèaïaçîía ýëåìåíòîâ. Òèï èòåðaòîðîâ äîëæåí áûòü «äëя ÷òåíèя».
Êîíñòðóêòîð 4 яâëяåòñя êîíñòðóêòîðîì êîïèðîâaíèя. Ïðèìåðû êîíñòðóêòîðîâ:
// Cîçäaåòñя î÷åðåäü èç 10 ðaâíûõ åäèíèöå ýëåìåíòîâ: deque d2 (10, 1);
// Cîçäaåòñя î÷åðåäü, ðaâíaя î÷åðåäè v1:
deque d4 (v1);
// Cîçäaåòñя î÷åðåäü èç äâóõ ýëåìåíòîâ, ðaâíûõ ïåðâûì äâóì
// ýëåìåíòaì âåêòîða v1 èç ïðåäûäóùåãî ðaçäåëa: deque d3 (v1.begin(), v1.begin() + 2);
// Cîçäaåòñя î÷åðåäü èç 10 îáúåêòîâ êëañña mOnstr (ñì. ñ. 183)
// (ðaáîòaåò êîíñòðóêòîð ïî óìîë÷aíèþ):
deque m1 (10);
// Cîçäaåòñя î÷åðåäü èç 5 îáúåêòîâ êëañña mOnstr ñ çaäaííûì èìåíåì
// (ðaáîòaåò êîíñòðóêòîð ñ ïaðaìåòðîì Char*): deque m2 (5, mOnstr("Âañя â î÷åðåäè"));
 øaáëîíå deque îïðåäåëåíû îïåðaöèя ïðèñâaèâaíèя, ôóíêöèя nîïèðîâaíèя, èòåðaòîðû, îïåðaöèè ñðaâíåíèя, îïåðaöèè è ôóíêöèè äîñòóïa n ýëåìåíòaì è èçìåíåíèя îáúånòîâ, aíaëîãè÷íûå ñîîòâåòñòâóþùèì îïåðaöèяì è ôóíêöèяì âåêòîða.
Âñòaâêa è óäaëåíèå òaê æå, êaê è äëя âåêòîða, âûïîëíяþòñя ça ïðîïîðöèîíaëü- íîå êîëè÷åñòâó ýëåìåíòîâ âðåìя. Åñëè ýòè îïåðaöèè âûïîëíяþòñя íaä âíóòðåí- íèìè ýëåìåíòaìè î÷åðåäè, âñå çía÷åíèя èòåðaòîðîâ è ññûëîê ía ýëåìåíòû î÷åðå- äè ñòaíîâяòñя íåäåéñòâèòåëüíûìè. Ïîñëå îïåðaöèé äîáaâëåíèя â ëþáîé èç êîíöîâ âñå çía÷åíèя èòåðaòîðîâ ñòaíîâяòñя íåäåéñòâèòåëüíûìè, a çía÷åíèя ññû- ëîê ía ýëåìåíòû î÷åðåäè ñîõðaíяþòñя. Ïîñëå îïåðaöèé âûáîðêè èç ëþáîãî êîí- öa ñòaíîâяòñя íåäåéñòâèòåëüíûìè òîëüêî çía÷åíèя èòåðaòîðîâ è ññûëîê, ñâяçaí- íûõ ñ ýòèìè ýëåìåíòaìè.
Êðîìå ïåðå÷èñëåííûõ, îïðåäåëåíû ôóíêöèè äîáaâëåíèя è âûáîðnè èç ía÷aëa
î÷åðåäè:
vOid push_frOnt(COnst T& value); vOid pOp_frOnt();
Ïðè âûáîðêå ýëåìåíò óäaëяåòñя èç î÷åðåäè.
Äëя î÷åðåäè íå îïðåäåëåíû ôóíêöèè CapaCity è reserve, íî åñòü ôóíêöèè resize è
size.
Ê î÷åðåäяì ìîæíî ïðèìåíяòü aëãîðèòìû ñòaíäaðòíîé áèáëèîòåêè, îïèñaííûå â ãëaâå 14 «Àëãîðèòìû» ía ñ. 343.
Do'stlaringiz bilan baham: |