Êëaññ sliCe (ñðåç) ïîçâîëяåò çaäaòü ïîäìíîæåñòâî èíäåêñîâ ýëåìåíòîâ ìaññèâa:
Class sliCe{ publiC:
sliCe();
sliCe(size_t start, size_t size, size_t stride); size_t start() COnst; // èíäåêñ ïåðâîãî ýëåìåíòa size_t size() COnst; // ÷èñëî ýëåìåíòîâ
size_t stride() COnst; // øaã
};
Øaã — ýòî ðaññòîяíèå ìåæäó äâóìя ýëåìåíòaìè ñðåça. Íaïðèìåð, sliCe(3, 4, 2) çaäaåò ñðåç, ñîñòîяùèé èç ýëåìåíòîâ ìaññèâa ñ íîìåðaìè 3, 5, 7, 9, a sliCe(1, 3, 4) — ñ íîìåðaìè 1, 5, 9. Òaêèì îáðaçîì, ñ ïîìîùüþ ñðåçîâ ìîæíî ïðåäñòaâèòü ìaññèâ êaê ìaòðèöó, çaäaâ â íåì ñòðîêó èëè ñòîëáåö.
Òåïåðü ìîæíî ïðèâåñòè ïðèìåð îïåðaöèè èíäåêñaöèè ïîäìíîæåñòâ ìaññèâa valarray, îïèñaííîé â ïðåäûäóùåì ðaçäåëå: îïåðaòîð a[sliCe(1, 5, 3)] = b âûïîë- íèò ïðèñâaèâaíèå ìaññèâa b òîëüêî ýëåìåíòaì ìaññèâa a, çaäaííûì ñðåçîì.
Äëя óäîáíîé ðaáîòû ñ ïîäìíîæåñòâîì ýëåìåíòîâ ìaññèâa ââåäåí øaáëîí êëañña sliCe_array. Caìîñòîяòåëüíûå îáúåêòû ýòîãî êëañña íå ñîçäaþòñя, âñå îáðaùåíèя ê íèì ía ñaìîì äåëå ïåðåaäðåñóþòñя ía èñõîäíûé ìaññèâ:
sliCe_array& s1 = v2[sliCe(0, v.size() / 10, 10)];
// Óâåëè÷èòü ía 5 ïåðâûé ñòîëáåö ìaòðèöû 10 Õ 10:
s1 += 5;
sliCe_array& s2 = v2[sliCe(0, v.size() / 10, 1)];
// Óâåëè÷èòü â 2 ðaça êazäûé ýëåìåíò ïåðâîé ñòðîêè ìaòðèöû 10 Õ 10: s2 *= 2;
 øaáëîíå sliCe_array îïðåäåëåíû ñëîæíûå îïåðaöèè ïðèñâaèâaíèя (+=, *=, >=
è ò. ä.), íaïðèìåð:
vOid OperatOr*= (COnst valarray&) COnst; vOid OperatOr/= (COnst valarray&) COnst;
Îíè âûïîëíяþò óêaçaííûå äåéñòâèя ñ aðãóìåíòîì è ýëåìåíòaìè èñõîäíîãî ìañ- ñèâa, çaäaííûìè ñðåçîì, ía êîòîðûå ññûëaåòñя sliCe_array. Êðîìå òîãî, îïðåäåëå- ía îïåð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ìè, ìîæíî ýôôåêòèâíî ðaáîòaòü ñ ìaññè- âîì valarray êaê ñ ìaòðèöåé ïðîèçâîëüíîé ðaçìåðíîñòè.
Åñëè òðåáóåòñя ðaáîòaòü ñ ïîäìíîæåñòâîì, êîòîðîå íåëüçя çaäaòü îäíèì ñðåçîì, èñïîëüçóåòñя øaáëîí gsliCe — îáîáùåííûé ñðåç:
Class gsliCe{ publiC:
gsliCe();
gsliCe(size_t s, COnst valarray& len, COnst valarray& d);
size_t start() COnst; // èíäåêñ ïåðâîãî ýëåìåíòa valarray size() COnst; // ÷èñëî ýëåìåíòîâ â èçìåðåíèè
valarray stride() COnst; // øaãè äëя èíäåêña[0], èíäåêña[1],…
};
Îáîáùåííûé ñðåç çaäaåò íåñêîëüêî ñðåçîâ. Èíäåêñ ía÷aëüíîãî ýëåìåíòa óêa- çûâaåòñя ïåðâûì ïaðaìåòðîì s, ðaçìåðû ñðåçîâ ïåðåäaþòñя ÷åðåç ìaññèâ len, a øaãè — ÷åðåç ìaññèâ d. Ðaçìåðíîñòè ìaññèâîâ, îïðåäåëяþùèå êîëè÷åñòâî çaäa- âaåìûõ ñðåçîâ, äîëæíû ñîâïaäaòü.
Íaïðèìåð, åñëè çaäaòü ïaðaìåòðû
start = 0
len = {2, 3}
d = {4, 1}
ïîëó÷èì ïîñëåäîâaòåëüíîñòü èíäåêñîâ ìaññèâa
k = (0,1) 4 + (0,1,2) 1
êîòîðûå äaäóò â ðåçóëüòaòå ìaòðèöó 23 èç ëåâîãî âåðõíåãî óãëa ìaòðèöû 34, ðañïîëîæåííîé â ïaìяòè ïî ñòîëáöaì (ïåðâûé ñðåç ñ äëèíîé 2 è øaãîì 4 îïèñû-
âaåò äâa ýëåìåíòa ñòðîêè, âòîðîé — ñ äëèíîé 3 è øaãîì 1 — îïèñûâaåò òðè ýëå- ìåíòa ñòîëáöa):
Èñõîäíaя ìaòðèöa:
|
Îáîáùåííûé ñðåç:
|
00 01 02
|
00 01
|
10 11 12
|
10 11
|
20 21 22
|
20 21
|
30 31 32
|
|
Ðañïîëîæåíèå â ïaìяòè:
|
|
00 10 20 30 01 11 21 31 02 12 22 32
|
|
Òåïåðü, ÷òîáû, íaïðèìåð, îáíóëèòü ýëåìåíòû ïîäìaòðèöû 23, ìîæíî çaïèñaòü:
valarray v(1, 12); // Cîçäaåì ìaññèâ èç åäèíèö int length[] = {2, 3};
int str[] = {4, 1}; valarray len (length, 2); valarray d (str, 2);
// Îáíóëяåì ýëåìåíòû v[0], v[1], v[2], v[4], v[5], v[6]: v[gsliCe(0, len, d)] = 0;
Àíaëîãè÷íî øaáëîíó sliCe_array, äëя ðaáîòû ñ ïîäìíîæåñòâîì ýëåìåíòîâ ìaññè- âa, çaäaííûì îáîáùåííûì ñðåçîì, ââåäåí øaáëîí êëañña gsliCe_array, ñîäåðæa- ùèé òîò æå íaáîð ýëåìåíòîâ, ÷òî è sliCe_array. Caìîñòîяòåëüíûå îáúåêòû êëañña gsliCe_array ñîçäaâaòü çaïðåùåíî: âñå îáðaùåíèя ê íèì ïåðåaäðåñóþòñя ía èñ- õîäíûé ìaññèâ.
Åñëè òðåáóåòñя çaäaòü ïðîèçâîëüíîå ïîäìíîæåñòâî ýëåìåíòîâ ìaññèâa, äëя êîòî- ðîãî íåëüçя îïèñaòü çaêîí èçìåíåíèя èíäåêñîâ, èñïîëüçóþò ëîãè÷åñnèé ìaññèâ mask_array, êîòîðûé ïðåäñòaâëяåò ñîáîé valarray. Ýëåìåíò ýòîãî ìaññèâa, ðaâíûé true, îçía÷aåò, ÷òî ñîîòâåòñòâóþùèé ýëåìåíò valarray âêëþ÷aåòñя â ïîä- ìíîæåñòâî. Äëя mask_array îïðåäåëåí òîò æå íaáîð ïîëåé è ìåòîäîâ êëañña, ÷òî è äëя gsliCe_array.
Îáúåêòû ýòîãî êëañña ïîëó÷aþòñя â ðåçóëüòaòå èñïîëüçîâaíèя â îïåðaöèяõ îáîá- ùåííîé èíäåêñaöèè valarray, îïèñaííûõ â ïðåäûäóùåì ðaçäåëå, íaïðèìåð:
bOOl m[] = {true, true, false, true, false}; valarray mask (m, 5);
// Ýëåìåíòaì íîìåð 0,1è2 ìaññèâa v6 ïðèñâaèâaåòñя
// çía÷åíèå ñèíóña ñîîòâåòñòâóþùèõ ýëåìåíòîâ ìaññèâa v4,
// îïèñaííîãî â ïðåäûäóùåì ðaçäåëå:
valarray v6 = sin(v4[mask]);
Äðóãîé ñïîñîá âûäåëåíèя ïðîèçâîëüíîãî ïîäìíîæåñòâa, ïîçâîëяþùèé ïåðåóïî- ðяäî÷èâaòü ýëåìåíòû valarray, яâëяåòñя nîñâåííûé ìaññèâ indireCt_array.  íåì çaäaåòñя ïîñëåäîâaòåëüíîñòü èíäåêñîâ ìaññèâa. Îáúåêò ýòîãî êëañña ñîçäaåòñя ïðè èñïîëüçîâaíèè â êa÷åñòâå èíäåêña valarray, íaïðèìåð:
int i[] = {3, 2, 4, 0, 1};
valarray index(i, 5);
valarray v7 = v4[index];
// v7[0] = v4[3], v7[1] = v4[2], v7[2] = v4[4], v7[3] = v4[0], v7[4] = v4[1]
×èñëî ýëåìåíòîâ ìaññèâa, èñïîëüçóåìîãî â êa÷åñòâå èíäåêña, íå äîëæíî ïðåâû- øaòü ÷èñëî ýëåìåíòîâ â èíäåêñèðóåìîì ìaññèâå.
Ïåðå÷èñëåííûå êëaññû — sliCe_array, gsliCe_array, mask_array è indireCt_array — íåëü- çя ñîçäaâaòü âïðяìóþ è êîïèðîâaòü. Îíè ïðîçða÷íû äëя ïîëüçîâaòåëя è ñîçäaþò- ñя â ðåçóëüòaòå èñïîëüçîâaíèя â êa÷åñòâå èíäåêña ìaññèâa valarray ñðåçîâ, îáîá- ùåííûõ ñðåçîâ, ëîãè÷åñêèõ ìaññèâîâ valarray è ìaññèâîâ òèïa size_t ñîîòâåòñòâåííî.
ГЛАВА 16
Do'stlaringiz bilan baham: |