Èòåðaòîðû âñòaâêè òaê æå, êaê è îáðaòíûå, яâëяþòñя aäaïòåðaìè èòåðaòîðîâ. Îíè ïðåäíaçía÷åíû äëя äîáaâëåíèя íîâûõ ýëåìåíòîâ â ía÷aëî, êîíåö èëè ïðîèç- âîëüíîå ìåñòî êîíòåéíåða.  ñòaíäaðòíîé áèáëèîòåêå îïðåäåëåíî òðè øaáëîía êëaññîâ èòåðaòîðîâ âñòaâêè, ïîñòðîåííûõ ía îñíîâå âûõîäíûõ èòåðaòîðîâ: baCk_insert_iteratOr, frOnt_insert_iteratOr è insert_iteratOr.
Êðîìå òîãî, îïðåäåëåíû òðè ôóíêöèè âñòaâêè:
template baCk_insert_iteratOr baCk_inserter(C& x);
template frOnt_insert_iteratOr frOnt_inserter(C& x);
template insert_iteratOr inserter(C& x, Iter i);
Çäåñü C — êîíòåéíåð, â êîòîðûé òðåáóåòñя âñòaâèòü ýëåìåíòû. Ôóíêöèя baCk_inserter âñòaâëяåò ýëåìåíòû â êîíåö êîíòåéíåða, frOnt_inserter — â ía÷aëî, a inserter — ïåðåä ýëåìåíòîì, ía êîòîðûé ññûëaåòñя åå aðãóìåíò-èòåðaòîð. Ýòè ôóíêöèè âîçâðaùaþò èòåðaòîðû ñîîòâåòñòâóþùåãî òèïa è ÷añòî èñïîëüçóþòñя â êa÷åñòâå aðãóìåíòîâ ñòaíäaðòíûõ aëãîðèòìîâ (ñì. 355), ãäå îïðåäåëяþò ðåæèì ð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 istream_iteratOr è èòåðaòîð âûõîäíîãî ïîòîêa Ostream_iteratOr.
Èòåðaòîð âõîäíîãî ïîòîna ÷èòaåò ýëåìåíòû èç ïîòîêa, äëя êîòîðîãî îí áûë ñîç- äaí, ïîñëå ÷åãî ê íèì ìîæíî îáðaùaòüñя îáû÷íûì äëя èòåðaòîða îáðaçîì, òî åñòü
÷åðåç îïåðaöèþ ðaçaäðåñaöèè. Íaïðèìåð, äëя ÷òåíèя öåëîãî ÷èñëa èç ôaéëa ñ èìåíåì temp ìîæíî èñïîëüçîâaòü ñëåäóþùèé ôðaãìåíò:
istream in("temp"); istream_iteratOr i(in); int buf = *i;
Î÷åðåäíîå çía÷åíèå èç âõîäíîãî ïîòîêa ñ÷èòûâaåòñя ïðè âûïîëíåíèè îïåðaöèè èíêðåìåíòa, íaïðèìåð:
++i;
int buf1 = *i;
Ïðè äîñòèæåíèè êîíöa âõîäíîãî ïîòîêa èòåðaòîð ïðèíèìaåò çía÷åíèå êîíöa ââîäa. Ýòî æå çía÷åíèå èìååò êîíñòðóêòîð èòåðaòîða ïî óìîë÷aíèþ, ïîýòîìó öèêë ÷òåíèя èç ôaéëa ìîæíî îðãaíèçîâaòü ñëåäóþùèì îáðaçîì:
while(i != istream_iteratOr () ) COut << *i++ << " ";
Äëя èòåðaòîðîâ âõîäíîãî ïîòîêa îïðåäåëåíû îïåðaöèè ñðaâíåíèя ía ðaâåíñòâî è íåðaâåíñòâî. Âñå èòåðaòîðû, ðaâíûå êîíöó ââîäa, ðaâíû ìåæäó ñîáîé. Cðaâíè- âaòü íå ðaâíûå êîíöó ââîäa èòåðaòîðû ìîæíî ïðè óñëîâèè, ÷òî îíè ñêîíñòðóèðî- âaíû äëя îäíîãî è òîãî æå ïîòîêa.
Îñîáåííîñòü èòåðaòîðîâ âõîäíîãî ïîòîêa çaêëþ÷aåòñя â òîì, ÷òî îíè íå ñîõðaíя- þò ðaâåíñòâî ïîñëå èíêðåìåíòaöèè, òî åñòü åñëè i == j, òî íå îáяçaòåëüíî, ÷òî
++i == ++j. Ïîýòîìó èõ ðåêîìåíäóåòñя èñïîëüçîâaòü òîëüêî â îäíîïðîõîäíûõ aë-
ãîðèòìaõ. Åñëè aëãîðèòì òðåáóåò íåñêîëüêèõ ïðîõîäîâ, ïðåäïî÷òèòåëüíåå èñ- ïîëüçîâaòü ñòðóêòóðû äaííûõ â îïåðaòèâíîé ïaìяòè.
Do'stlaringiz bilan baham: |