Множества с дубликатами (multiset)
Âî ìíîæåñòâaõ ñ äóáëèêaòaìè êëþ÷è ìîãóò ïîâòîðяòüñя, ïîýòîìó îïåðaöèя âñòaâêè ýëåìåíòa âñåãäa âûïîëíяåòñя óñïåøíî, è ôóíêöèя insert âîçâðaùaåò èòåðaòîð ía âñòaâëåííûé ýëåìåíò. Ýëåìåíòû ñ îäèíaêîâûìè êëþ÷aìè õðaíяòñя â ñëîâaðå â ïîðяäêå èõ çaíåñåíèя. Ôóíêöèя find âîçâðaùaåò èòåðaòîð ía ïåðâûé íaéäåííûé ýëåìåíò èëè end(), åñëè íè îäíîãî ýëåìåíòa ñ çaäaííûì êëþ÷îì íå íaéäåíî.
Ïðè ðaáîòå ñ îäèíaêîâûìè êëþ÷aìè â multiset ÷añòî ïîëüçóþòñя ôóíêöèяìè COunt, lOwer_bOund, upper_bOund è equal_range, èìåþùèìè òîò æå ñìûñë, ÷òî è äëя ñëîâaðåé ñ äóáëèêaòaìè.
Битовые множества (bitset)
Áèòîâîå ìíîæåñòâî ïðåäñòaâëяåò ñîáîé øaáëîí äëя ïðåäñòaâëåíèя è îáðaáîòêè äëèííûõ ïîñëåäîâaòåëüíîñòåé áèòîâ1. Ôaêòè÷åñêè bitset — ýòî áèòîâûé ìaññèâ, äëя êîòîðîãî îáåñïå÷èâaþòñя îïåðaöèè ïðîèçâîëüíîãî äîñòóïa, èçìåíåíèя îò- äåëüíûõ áèòîâ è âñåãî ìaññèâa. Áèòû íóìåðóþòñя ñïðaâa íaëåâî, ía÷èíaя ñ 0.
Øaáëîí áèòîâîãî ìíîæåñòâa îïðåäåëåí â çaãîëîâî÷íîì ôaéëå . Ïaðaìåò- ðîì øaáëîía яâëяåòñя äëèía áèòîâîé ïîñëåäîâaòåëüíîñòè, êîòîðaя äîëæía áûòü êîíñòaíòîé:
template Class bitset{… };
Äëя aäðåñaöèè îòäåëüíîãî áèòa â bitset ââåäåí êëaññ referenCe: Class referenCe {
friend Class bitset;
referenCe(); publiC:
~referenCe();
referenCe& OperatOr=(bOOl x); // äëя b[i] = x; referenCe& OperatOr=(COnst referenCe&); // äëя b[i] = b[j]; bOOl OperatOr~() COnst; // èíâåðñèя b[i]
OperatOr bOOl() COnst; // äëя x = b[i];
referenCe& flip(); // äëя èíâåðñèè b[i];
};
Êîíñòðónòîðû ïîçâîëяþò ñîçäaòü áèòîâîå ìíîæåñòâî èç âñåõ íóëåé, èç çía÷åíèя òèïa lOng èëè èç ñòðîêè òèïa string2:
bitset(); // 1
bitset(unsigned lOng val); // 2
1 Ìîæåò îêaçaòüñя, ÷òî â çaâèñèìîñòè îò ðåaëèçaöèè áèòîâûå ïîñëåäîâaòåëüíîñòè, äëя ðaçìåùåíèя êîòîðûõ íåäîñòaòî÷íî ïåðåìåííîé òèïa int, íî äîñòaòî÷íî lOng, áîëåå ýô- ôåêòèâíî îáðaáaòûâaòü ñ ïîìîùüþ áèòîâûõ îïåðaöèé íaä öåëûìè ÷èñëaìè (ñì. 31). Êîðîòêèå ïîñëåäîâaòåëüíîñòè, óìåùaþùèåñя â îäíîì ñëîâå, ìîãóò îáðaáaòûâaòüñя ñ ïî- ìîùüþ áèòîâîãî ìíîæåñòâa áîëåå ýôôåêòèâíî.
2 Îïèñaíèå êîíñòðóêòîðîâ ïðèâåäåíî ñ ñîêðaùåíèяìè.
expliCit bitset(COnst string& str, // 3 string::size_type pOs = 0, string::size_type n = string::npOs);
Ïåðâûé êîíñòðóêòîð ñîçäaåò áèòîâîå ìíîæåñòâî èç íóëåé, âòîðîé ïðèíèìaåò çía÷åíèå òèïa lOng è èíèöèaëèçèðóåò êaæäûé áèò ìíîæåñòâa ñîîòâåòñòâóþùèì áèòîì âíóòðåííåãî ïðåäñòaâëåíèя ýòîãî çía÷åíèя. Òðåòèé êîíñòðóêòîð ïðèíèìa- åò ñòðîêó, êîòîðaя äîëæía ñîñòîяòü èç íóëåé è åäèíèö (åñëè ýòî íå òaê, ïîðîæäa- åòñя èñêëþ÷åíèå invalid_argument) è èíèöèaëèçèðóåò êaæäûé áèò ìíîæåñòâa â ñîîòâåòñòâèè ñî çía÷åíèåì ñèìâîëa ñòðîêè. Âòîðîé è òðåòèé ïaðaìåòðû êîíñò- ðóêòîða çaäaþò ïîçèöèè ía÷aëa ñòðîêè è êîëè÷åñòâa ñèìâîëîâ, êîòîðûå èñïîëü- çóþòñя äëя èíèöèaëèçaöèè. Ïî óìîë÷aíèþ èñïîëüçóåòñя âñя ñòðîêa.
Ïðèìåðû ñîçäaíèя áèòîâûõ ìíîæåñòâ:
bitset <100> b1;
|
// ñòî íóëåé
|
bitset <16> b2 (0xf0f);
|
// 0000111100001111
|
bitset <16> b3 ("0000111100001111");
|
// 0000111100001111
|
bitset <5> b4 ("00110011", 3);
|
// 10011
|
bitset <3> b5 ("00110101", 1, 3);
|
// 011
|
C áèòîâûìè ìíîæåñòâaìè ìîæíî âûïîëíяòü ñëåäóþùèå îïåðaöèè:
bOOl OperatOr==(COnst bitset& rhs) COnst; bOOl OperatOr!=(COnst bitset& rhs) COnst; bitset& OperatOr&=(COnst bitset& rhs); bitset& OperatOr|=(COnst bitset& rhs); bitset& OperatOr^=(COnst bitset& rhs); bitset OperatOr<<(size_t pOs) COnst; bitset OperatOr>>(size_t pOs) COnst; bitset& OperatOr<<=(size_t pOs); bitset& OperatOr>>=(size_t pOs); bitset& set();
bitset& set(size_t pOs, int val = true); bitset& reset();
bitset& reset(size_t pOs); bitset OperatOr~() COnst; bitset& flip();
bitset& flip(size_t pOs);
referenCe OperatOr[](size_t pOs); // b[i];
Ìíîæåñòâa ìîæíî ñðaâíèâaòü ía ðaâåíñòâî (= =) è íåðaâåíñòâî (!=). Îïåðaöèè << è >> ñîçäaþò áèòîâûå íaáîðû, ñäâèíóòûå ía pOs áèò âëåâî èëè âïðaâî ñîîòâåòñò- âåííî. Ïðè ñäâèãå îñâîáîæäaþùèåñя ïîçèöèè çaïîëíяþòñя íóëяìè. Îïåðaöèя set óñòaíaâëèâaåò âñå áèòû ìíîæåñòâa â 1, reset — â 0. Îïåðaöèя ~ ñîçäaåò äîïîë- íèòåëüíûé íaáîð. C ïîìîùüþ flip ìîæíî èíâåðòèðîâaòü çía÷åíèå êaæäîãî áèòa èëè áèòa, çaäaííîãî ïaðaìåòðîì pOs.
Äîñòóï ê îòäåëüíîìó áèòó ìîæíî âûïîëíяòü ñ ïîìîùüþ îïåðaöèè èíäånñaöèè. Åñëè çía÷åíèå èíäåêña âûõîäèò ça ãðaíèöû íaáîða, ïîðîæäaåòñя èñêëþ÷åíèå Out_Of_range.
 øaáëîíå bitset îïðåäåëåíû ìåòîäû ïðåîáðaçîâaíèя â äëèííîå öåëîå è â ñòðî- êó, a òaêæå aíaëèça çía÷åíèé ìíîæåñòâa:
unsigned lOng tO_ulOng() COnst; // â unsigned lOng string tO_string() COnst; // â string
size_t COunt() COnst; // êîëè÷åñòâî áèòîâûõ 1
size_t size() COnst; // êîëè÷åñòâî áèòîâ
bOOl test(size_t pOs) COnst; // true, åñëè b[pOs]== 1
bOOl any() COnst; // true, åñëè õîòя áû îäèí áèò ðaâåí 1
bOOl nOne() COnst; // true, åñëè íè îäèí áèò íå ðaâåí 1
Îïðåäåëåíû òaêæå îáû÷íûå îïåðaöèè ââîäa è âûâîäa << è >>. Áèòû ìíîæåñòâa âûâîäяòñя ñ ïîìîùüþ ñèìâîëîâ '0' è '1' ñëåâa íaïðaâî, ñaìûé ñòaðøèé áèò ñëåâa.
 áèòîâîì ìíîæåñòâå íå îïðåäåëåíû èòåðaòîðû, ïîýòîìó îíî íå яâëяåòñя êîí- òåéíåðîì â ÷èñòîì âèäå, ïîñêîëüêó íå ïîëíîñòüþ îáåñïå÷èâaåò ñòaíäaðòíûé èí- òåðôåéñ êîíòåéíåðîâ.
3>5>16>16>100>
Do'stlaringiz bilan baham: |