Таблица 13.1. Категории итераторов
Категория итератора
|
Операции
|
Контейнеры
|
âõîäíîé (input)
|
x= *i
|
âñå
|
âûõîäíîé (Output)
|
*i=x
|
âñå
|
ïðяìîé (fOrward)
|
x= *i, *i=x
|
âñå
|
äâóíaïðaâëåííûé (bidireCtiOnal)
|
x= *i, *i= x,
--i, i--
|
âñå
|
ïðîèçâîëüíîãî äîñòóïa
|
x= *i, *i= x,
|
âñå, êðîìå list
|
(randOm aCCess)
|
--i, i--
|
|
|
i+ n, i– n, i += n, i -=n
|
|
|
i< j, i> j, i <= j, i >=j
|
|
Ê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. ×åì âûøå óðîâåíü èòåð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òîð ìîæåò áûòü äåññòâèòåëüíûì (êîãä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é. Ïîíяòèя «íóëåâîé èòåðaòîð» íå ñóùåñòâóåò.
Ïîñêîëüêó èòåðaòîðû èñïîëüçóþòñя äëя ðaáîòû ñ îáúåêòaìè, ía êîòîðûå îíè óêaçûâaþò (íaïðèìåð, äëя ïîëó÷åíèя çía÷åíèя ýëåìåíòa êîíòåéíåða), òðåáóåòñя îïðåäåëèòü ñîîòâåòñòâóþùèå òèïû. Äëя ýòîãî â çaãîëîâî÷íîì ôaéëå îïðåäåëåí øaáëîí iteratOr_traits (trait â ïåðåâîäå ñ aíãëèéñêîãî — õaðaêòåðíaя
÷åðòa).
template struCt iteratOr_traits{
typedef typename Iter::differenCe_type differenCe_type; typedef typename Iter::value_type value_type;
typedef typename Iter::pOinter pOinter; typedef typename Iter::referenCe referenCe;
typedef typename Iter::iteratOr_CategOry iteratOr_CategOry;
};
Êëþ÷åâîå ñëîâî typename íåîáõîäèìî äëя òîãî, ÷òîáû êîìïèëяòîð ìîã îïîçíaòü Iter êaê èìя òèïa. iteratOr_CategOry — ýòî òèï èòåðaòîða, êîòîðûé îïðåäåëяåò, êa- êèå îí ïîääåðæèâaåò îïåðaöèè. Òèï differenCe_type ñëóæèò äëя âûðaæåíèя ðaç- íîñòè ìåæäó äâóìя èòåðaòîðaìè.
 çaãîëîâî÷íîì ôaéëå îïèñaíû ñëåäóþùèå òèïû èòåðaòîðîâ:
struCt input_iteratOr_tag{}; struCt Output_iteratOr_tag{};
struCt fOrward_iteratOr_tag: publiC input_iteratOr_tag{}; struCt bidireCtiOnal_iteratOr_tag:
publiC fOrward_iteratOr_tag{}; struCt randOm_aCCess_iteratOr_tag:
publiC bidireCtiOnal_iteratOr_tag{};
Òèï èòåð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 iteratOr_traits (î ñïåöèaëèçaöèяõ øaáëîíîâ ðaññêaçûâa- ëîñü ía ñ. 220):
template struCt iteratOr_traits{ typedef ptrdiff_t differenCe_type;
typedef T value_type; typedef T* pOinter; typedef T& referenCe;
typedef randOm_aCCess_iteratOr_tag iteratOr_CategOry;
};
Ðaçíîñòü ìåæäó äâóìя óêaçaòåëяìè èìååò ñòaíäaðòíûé òèï ptrdiff_t, îïðåäå- ëåííûé â . Àíaëîãè÷íaя ñïåöèaëèçaöèя øaáëîía ââåäåía è äëя òèïa COnst T*.
Ïîñêîëüêó òîëüêî èòåðaòîðû ïðîèçâîëüíîãî äîñòóïa ïîääåðæèâaþò îïåðaöèè + è –, â áèáëèîòåêå îïèñaíû ôóíêöèè distanCe è advanCe. Ôóíêöèя distanCe ñëóæèò äëя îïðåäåëåíèя ðaññòîяíèя ìåæäó ýëåìåíòaìè êîíòåéíåða:
distanCe(InputIteratOr first, InputIteratOr last);
Îía âîçâðaùaåò çía÷åíèå òèïa differenCe_type, ïðåäñòaâëяþùåå ñîáîé ðaçíîñòü ìåæäó äâóìя èòåðaòîðaìè. Ýòa ôóíêöèя äëя âñåõ èòåðaòîðîâ, êðîìå èòåðaòîðîâ ïðîèçâîëüíîãî äîñòóïa, âûïîëíяåòñя ñ èñïîëüçîâaíèåì îïåðaöèè ++ ça âðåìя, ïðîïîðöèîíaëüíîå ðaññòîяíèþ ìåæäó ýëåìåíòaìè êîíòåéíåða, òî åñòü äîâîëüíî ðåñóðñîåìêa. Àíaëîãè÷íî ðaáîòaåò è ôóíêöèя advanCe, êîòîðaя ïðèìåíяåòñя äëя ðåaëèçaöèè îïåðaöèè i += n:
vOid advanCe(InputIteratOr& i, DistanCe n);
Âåëè÷èía n ìîæåò áûòü îòðèöaòåëüíîé òîëüêî äëя äâóíaïðaâëåííûõ èòåðaòîðîâ è èòåðaòîðîâ ïðîèçâîëüíîãî äîñòóïa.
Do'stlaringiz bilan baham: |