Èòåðaòîðû êëañña veCtOr ïåðå÷èñëåíû â òaáë. 12.
Äîñòóï n ýëåìåíòaì âåêòîða îñóùåñòâëяåòñя ñ ïîìîùüþ ñëåäóþùèõ îïåðaöèé è ìåòîäîâ:
referenCe OperatOr[](size_type n); COnst_referenCe OperatOr[](size_type n) COnst;
COnst_referenCe at(size_type n) COnst; referenCe at(size_type n);
referenCe frOnt(); COnst_referenCe frOnt() COnst; referenCe baCk(); COnst_referenCe baCk() COnst;
Îïåðaöèя [ ] îñóùåñòâëяåò äîñòóï ê ýëåìåíòó âåêòîða ïî èíäåêñó áåç ïðîâåðêè åãî âûõîäa ça ãðaíèöó âåêòîða. Ôóíêöèя at âûïîëíяåò òaêóþ ïðîâåðêó è ïîðîæ- äaåò èñêëþ÷åíèå Out_Of_range â ñëó÷aå âûõîäa ça ãðaíèöó âåêòîða. Åñòåñòâåííî,
÷òî ôóíêöèя at ðaáîòaåò ìåäëåííåå, ÷åì îïåðaöèя [ ], ïîýòîìó â ñëó÷aяõ, êîãäa äèaïaçîí îïðåäåëåí яâíî, ïðåäïî÷òèòåëüíåå ïîëüçîâaòüñя îïåðaöèåé:
fOr (inti= 0; i ïðîòèâíîì ñëó÷aå èñïîëüçóåòñя ôóíêöèя at ñ îáðaáîòêîé èñêëþ÷åíèя:
try{
//…
v.at(i) = v.at(…);
}
CatCh(Out_Of_range) { … }
Îïåðaöèè äîñòóïa âîçâðaùaþò çía÷åíèå ññûëêè ía ýëåìåíò (referenCe) èëè êîí- ñòaíòíîé ññûëêè (COnst_referenCe) â çaâèñèìîñòè îò òîãî, ïðèìåíяþòñя ëè îíè ê êîíñòaíòíîìó îáúåêòó èëè íåò.
Ìåòîäû frOnt è baCk âîçâðaùaþò ññûëêè ñîîòâåòñòâåííî ía ïåðâûé è ïîñëåäíèé ýëåìåíòû âåêòîða (ýòî íå òî æå ñaìîå, ÷òî begin — óêaçaòåëü ía ïåðâûé ýëåìåíò è end — óêaçaòåëü ía ýëåìåíò, ñëåäóþùèé ça ïîñëåäíèì). Ïðèìåð:
veCtOr v(5, 10);
v.frOnt() = 100; v.baCk() = 100;
COut << v[0] <<"" <Ôóíêöèя CapaCity îïðåäåëяåò ðaçìåð îïåðaòèâíîé ïaìяòè, çaíèìaåìîé âåêòîðîì:
size_type CapaCity() COnst;
Ïaìяòü ïîä âåêòîð âûäåëяåòñя äèíaìè÷åñêè, íî íå ïîä îäèí ýëåìåíò â êaæäûé ìîìåíò âðåìåíè (ýòî áûëî áû ðañòî÷èòåëüíûì ðañõîäîâaíèåì ðåñóðñîâ), a ñðaçó ïîä ãðóïïó ýëåìåíòîâ, íaïðèìåð, 256 èëè 1024. Ïåðåðañïðåäåëåíèå ïaìяòè ïðî- èñõîäèò òîëüêî ïðè ïðåâûøåíèè ýòîãî êîëè÷åñòâa ýëåìåíòîâ, ïðè ýòîì îáúåì âûäåëåííîãî ïðîñòðaíñòâa óäâaèâaåòñя. Ïîñëå ïåðåðañïðåäåëåíèя ëþáûå èòåða- òîðû, ññûëaþùèåñя ía ýëåìåíòû âåêòîða, ñòaíîâяòñя íåäåéñòâèòåëüíûìè, ïî- ñêîëüêó âåêòîð ìîæåò áûòü ïåðåìåùåí â äðóãîé ó÷añòîê ïaìяòè, è íåëüçя îæè- äaòü, ÷òî ñâяçaííûå ñ íèì ññûëêè áóäóò îáíîâëåíû aâòîìaòè÷åñêè.
Cóùåñòâóåò òaêæå ôóíêöèя âûäåëåíèя ïaìяòè reserve, êîòîðaя ïîçâîëяåò çaäaòü, ñêîëüêî ïaìяòè òðåáóåòñя äëя õðaíåíèя âåêòîða:
vOid reserve(size_type n);
Ïðèìåð ïðèìåíåíèя ôóíêöèè:
veCtOr v;
v.reserve(1000); // Âûäåëåíèå ïaìяòè ïîä 1000 ýëåìåíòîâ
Ïîñëå âûïîëíåíèя ýòîé ôóíêöèè çía÷åíèå ôóíêöèè CapaCity áóäåò ðaâíî ïî ìåíüøåé ìåðå n. Ôóíêöèþ reserve ïîëåçíî ïðèìåíяòü òîãäa, êîãäa ðaçìåð âåêòî- ða èçâåñòåí çaðaíåå.
Äëя èçìåíåíèя ðaçìåðîâ âåêòîða ñëóæèò ôóíêöèя resize: vOid resize(size_type sz,TC= T());
Ýòa ôóíêöèя óâåëè÷èâaåò èëè óìåíüøaåò ðaçìåð âåêòîða â çaâèñèìîñòè îò òîãî, áîëüøå çaäaâaåìîå çía÷åíèå sz, ÷åì çía÷åíèå size(), èëè ìåíüøå. Âòîðîé ïaða- ìåòð çaäaåò çía÷åíèå, êîòîðîå ïðèñâaèâaåòñя âñåì íîâûì ýëåìåíòaì âåêòîða. Îíè ïîìåùaþòñя â êîíåö âåêòîða. Åñëè íîâûé ðaçìåð ìåíüøå, ÷åì çía÷åíèå size(), èç êîíöa âåêòîða óäaëяåòñя size() – sz ýëåìåíòîâ.
Îïðåäåëåíû ñëåäóþùèå ìåòîäû äëя èçìåíåíèя îáúånòîâ êëañña veCtOr: vOid push_baCk(COnst T& value);
vOid pOp_baCk();
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
Ôóíêöèя push_baCk äîáaâëяåò ýëåìåíò â êîíåö âåêòîða, ôóíêöèя pOp_baCk — óäa- ëяåò ýëåìåíò èç êîíöa âåêòîða.
Ôóíêöèя insert ñëóæèò äëя âñòaâêè ýëåìåíòa â âåêòîð. Ïåðâaя ôîðìa ôóíêöèè âñòaâëяåò ýëåìåíò value â ïîçèöèþ, çaäaííóþ ïåðâûì ïaðaìåòðîì (èòåðaòîðîì), è âîçâðaùaåò èòåðaòîð, ññûëaþùèéñя ía âñòaâëåííûé ýëåìåíò. Âòîðaя ôîðìa ôóíêöèè âñòaâëяåò â âåêòîð n îäèíaêîâûõ ýëåìåíòîâ. Òðåòüя ôîðìa ôóíêöèè ïî- çâîëяåò âñòaâèòü íåñêîëüêî ýëåìåíòîâ, êîòîðûå ìîãóò áûòü çaäaíû ëþáûì äèa- ïaçîíîì ýëåìåíòîâ ïîäõîäяùåãî òèïa, íaïðèìåð:
veCtOr v(2), v1(3,9); int m[3] = {3, 4, 5};
v.insert(v.begin(), m, m + 3); // Cîäåðzèìîå v:34500 v1.insert(v1.begin() + 1, v.begin(),v.begin() + 2);
// Cîäåðzèìîå v1:93499
Âñò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íîâяò- ñя íåäåéñòâèòåëüíûìè.
Ôóíêöèя erase ñëóæèò äëя óäaëåíèя îäíîãî ýëåìåíòa âåêòîða (ïåðâaя ôîðìa ôóíêöèè) èëè äèaïaçîía, çaäaííîãî ñ ïîìîùüþ èòåðaòîðîâ (âòîðaя ôîðìa):
veCtOr v;
fOr (inti= 1; i<6; i++)v.push_baCk(i);
// Cîäåðzèìîå v:12345
v.erase(v.begin()); // Cîäåðzèìîå v:2345 v.erase(v.begin(), v.begin() + 2); // Cîäåðzèìîå v: 4 5
Îáðaòèòå âíèìaíèå, ÷òî òðåòüèì ïaðaìåòðîì çaäaåòñя íå ïîñëåäíèé óäaëяåìûé ýëåìåíò, a ýëåìåíò, ñëåäóþùèé ça íèì.
Êaæäûé âûçîâ ôóíêöèè erase òaê æå, êaê è â ñëó÷aå âñòaâêè, çaíèìaåò âðåìя, ïðîïîðöèîíaëüíîå êîëè÷åñòâó ñäâèãaåìûõ ía íîâûå ïîçèöèè ýëåìåíòîâ. Âñå èòåðaòîðû è ññûëêè «ïðaâåå» ìåñòa óäaëåíèя ñòaíîâяòñя íåäåéñòâèòåëüíûìè.
Ôóíêöèя swap ñëóæèò äëя îáìåía ýëåìåíòîâ äâóõ âåêòîðîâ îäíîãî òèïa, íî íå îáяçaòåëüíî îäíîãî ðaçìåða:
veCtOr v1, v2;
…
v1.swap(v2); // Ýêâèâaëåíòíî v2.swap(v1);
Äëя âåêòîðîâ îïðåäåëåíû îïåðaöèè ñðaâíåíèя = =, !=, <, , <= è =. Äâa âåêòîða ñ÷è- òaþòñя ðaâíûìè, åñëè ðaâíû èõ ðaçìåðû è âñå ñîîòâåòñòâóþùèå ïaðû ýëåìåíòîâ. Îäèí âåêòîð ìåíüøå äðóãîãî, åñëè ïåðâûé èç ýëåìåíòîâ îäíîãî âåêòîða, íå ðaâ- íûé ñîîòâåòñòâóþùåìó ýëåìåíòó äðóãîãî, ìåíüøå íåãî (òî åñòü ñðaâíåíèå ëåêñè- êîãðaôè÷åñêîå). Ïðèìåð:
inClude using namespaCe std; veCtOr v7, v8; int main(){
fOr (inti= 0; i<6; i++)v7.push_baCk(i); COut << "v7: ";
fOr (inti= 0; i<6; i++) COut << v7[i] << " "; COut << endl;
fOr (inti= 0; i<3; i++)v8.push_baCk(i+1); COut << "v8: ";
fOr (inti= 0; i<3; i++) COut << v8[i] << " "; COut << endl;
if (v7 < v8 ) COut << " v7 < v8" << endl; else COut << " v7 > v8" << endl;
}
Ðåçóëüòaò ðaáîòû ïðîãðaììû:
v7:012345
v8:123
v7Äëя ýôôåêòèâíîé ðaáîòû ñ âåêòîðaìè â ñòaíäaðòíîé áèáëèîòåêå îïðåäåëåíû øaáëîíû ôóíêöèé, íaçûâaåìûå aëãîðèòìaìè. Îíè âêëþ÷aþò â ñåáя ïîèñê çía÷å- íèé, ñîðòèðîâêó ýëåìåíòîâ, âñòaâêó, çaìåíó, óäaëåíèå è äðóãèå îïåðaöèè. Àëãî- ðèòìû îïèñaíû â ðaçäåëå «Àëãîðèòìû» ía ñ. 343.
Векторы логических значений (vector )
Cïåöèaëèçaöèя øaáëîía veCtOr îïðåäåëåía äëя îïòèìèçaöèè ðaçìåùåíèя ïaìяòè, ïîñêîëüêó ìîæíî ðåaëèçîâaòü âåêòîð ëîãè÷åñêèõ çía÷åíèé òaê, ÷òîáû
åãî ýëåìåíò çaíèìaë 1 áèò. Ïðè ýòîì aäðåñaöèя îòäåëüíûõ áèòîâ âûïîëíяåòñя ïðîãðaììíî. Èòåðaòîð òaêîãî âåêòîða íå ìîæåò áûòü óêaçaòåëåì.  îñòaëüíîì âåêòîðû ëîãè÷åñêèõ çía÷åíèé aíaëîãè÷íû îáû÷íûì è ðåaëèçóþò òîò æå íaáîð îïåðaöèé è ìåòîäîâ.  äîïîëíåíèå ê íèì îïðåäåëåíû ìåòîäû èíâåðòèðîâaíèя áèòa è âåêòîða â öåëîì (flip).
Cñûëêa ía ýëåìåíò âåêòîða ëîãè÷åñêèõ çía÷åíèé ðåaëèçîâaía â âèäå êëañña
referenCe, ìîäåëèðóþùåãî îáû÷íóþ ññûëêó ía ýëåìåíò:
Class referenCe{
friend Class veCtOr; referenCe();
publiC:
~referenCe();
OperatOr bOOl() COnst;
referenCe& OperatOr=(COnst bOOl x); referenCe& OperatOr=(COnst referenCe& x); vOid flip();
};
Ïðèìåð (ñ êëaâèaòóðû ââîäяòñя â âåêòîð 10 çía÷åíèé 0 èëè 1, ïîñëå ÷åãî îíè âû- âîäяòñя ía ýêðaí).
inClude inClude using namespaCe std; veCtOr v (10); int main(){
fOr(inti= 0; i> v[i];
fOr (veCtOr :: COnst_iteratOrp= v.begin(); p!=v.end(); ++p) COut << *p;
}
Do'stlaringiz bilan baham: |