<?xml version="1.0" encoding="windows-1251"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
 <description>
  <title-info>
   <genre>comp_programming</genre>
   <author>
    <first-name>Àëåêñàíäð</first-name>
    <last-name>Ñòåïàíîâ</last-name>
    <email>stepanov@mti.sgi.com</email>
   </author>
   <author>
    <first-name>Ìåíã</first-name>
    <last-name>Ëè</last-name>
    <email>lee@hlp.hp.com</email>
   </author>
   <book-title>ÐÓÊÎÂÎÄÑÒÂÎ ÏÎ ÑÒÀÍÄÀÐÒÍÎÉ ÁÈÁËÈÎÒÅÊÅ ØÀÁËÎÍÎÂ (STL)</book-title>
   <date>1999</date>
   <lang>ru</lang>
   <src-lang>en</src-lang>
   <translator>
    <first-name>Àëåêñåé</first-name>
    <last-name>Ñóõàíîâ</last-name>
   </translator>
   <translator>
    <first-name>Àíäðåé</first-name>
    <last-name>Êóòûðèí</last-name>
   </translator>
  </title-info>
  <document-info>
   <author>
    <nickname>honorato bonafe</nickname>
   </author>
   <program-used>Fiction Book Designer, FB Editor v2.0</program-used>
   <date value="2009-09-02">02.09.2009</date>
   <id>FBD-9F0713-1705-7D48-14A2-7EFB-4F34-F62F8A</id>
   <version>1.0</version>
   <history>
    <p>1.0 chm-›fb2 </p>
   </history>
  </document-info>
  <publish-info>
   <publisher>ÌÎÑÊÎÂÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÈÍÑÒÈÒÓÒ ÐÀÄÈÎÒÅÕÍÈÊÈ, ÝËÅÊÒÐÎÍÈÊÈ È ÀÂÒÎÌÀÒÈÊÈ (ÒÅÕÍÈ×ÅÑÊÈÉ ÓÍÈÂÅÐÑÈÒÅÒ)</publisher>
   <city>Ìîñêâà</city>
   <year>1999</year>
  </publish-info>
 </description>
 <body>
  <title>
   <p>Àëåêñàíäð Ñòåïàíîâ</p>
   <p>Ìåíã Ëè</p>
   <p>ÐÓÊÎÂÎÄÑÒÂÎ ÏÎ ÑÒÀÍÄÀÐÒÍÎÉ ÁÈÁËÈÎÒÅÊÅ ØÀÁËÎÍÎÂ (STL)</p>
  </title>
  <section>
   <title>
    <p>Ââåäåíèå</p>
   </title>
   <p>Ñòàíäàðòíàÿ Áèáëèîòåêà Øàáëîíîâ ïðåäîñòàâëÿåò íàáîð õîðîøî ñêîíñòðóèðîâàííûõ è ñîãëàñîâàííî ðàáîòàþùèõ âìåñòå îáîáù¸ííûõ êîìïîíåíòîâ C++. Îñîáàÿ çàáîòà áûëà ïðîÿâëåíà äëÿ îáåñïå÷åíèÿ òîãî, ÷òîáû âñå øàáëîííûå àëãîðèòìû ðàáîòàëè íå òîëüêî ñî ñòðóêòóðàìè äàííûõ â áèáëèîòåêå, íî òàêæå è ñ âñòðîåííûìè ñòðóêòóðàìè äàííûõ C++. Íàïðèìåð, âñå àëãîðèòìû ðàáîòàþò ñ îáû÷íûìè óêàçàòåëÿìè. Îðòîãîíàëüíûé ïðîåêò áèáëèîòåêè ïîçâîëÿåò ïðîãðàììèñòàì èñïîëüçîâàòü áèáëèîòå÷íûå ñòðóêòóðû äàííûõ ñî ñâîèìè ñîáñòâåííûìè àëãîðèòìàìè, à áèáëèîòå÷íûå àëãîðèòìû - ñî ñâîèìè ñîáñòâåííûìè ñòðóêòóðàìè äàííûõ. Õîðîøî îïðåäåë¸ííûå ñåìàíòè÷åñêèå òðåáîâàíèÿ è òðåáîâàíèÿ ñëîæíîñòè ãàðàíòèðóþò, ÷òî êîìïîíåíò ïîëüçîâàòåëÿ áóäåò ðàáîòàòü ñ áèáëèîòåêîé è ÷òî îí áóäåò ðàáîòàòü ýôôåêòèâíî. Ýòà ãèáêîñòü îáåñïå÷èâàåò øèðîêóþ ïðèìåíèìîñòü áèáëèîòåêè.</p>
   <p>Äðóãîå âàæíîå ñîîáðàæåíèå - ýôôåêòèâíîñòü. C++ óñïåøåí, ïîòîìó ÷òî îí îáúåäèíÿåò âûðàçèòåëüíóþ ìîùíîñòü ñ ýôôåêòèâíîñòüþ. Ìíîãî óñèëèé áûëî ïîòðà÷åíî, ÷òîáû ïðîâåðèòü, ÷òî êàæäûé øàáëîííûé êîìïîíåíò â áèáëèîòåêå èìååò îáîáù¸ííóþ ðåàëèçàöèþ, êîòîðàÿ èìååò ýôôåêòèâíîñòü âûïîëíåíèÿ ñ ðàçíèöåé â ïðåäåëàõ íåñêîëüêèõ ïðîöåíòîâ îò ýôôåêòèâíîñòè ñîîòâåòñòâóþùåé ïðîãðàììû ðó÷íîé êîäèðîâêè.</p>
   <p>Òðåòüèì ñîîáðàæåíèåì â ïðîåêòå áûëà ðàçðàáîòêà áèáëèîòå÷íîé ñòðóêòóðû, êîòîðàÿ, áóäó÷è åñòåñòâåííîé è ë¸ãêîé äëÿ ïîíèìàíèÿ, îñíîâàíà íà ïðî÷íîé òåîðåòè÷åñêîé îñíîâå.</p>
  </section>
  <section>
   <title>
    <p>Ñòðóêòóðà áèáëèîòåêè</p>
   </title>
   <p>Áèáëèîòåêà ñîäåðæèò ïÿòü îñíîâíûõ âèäîâ êîìïîíåíòîâ:</p>
   <p>- àëãîðèòì (<emphasis>algorithm</emphasis>): îïðåäåëÿåò âû÷èñëèòåëüíóþ ïðîöåäóðó.</p>
   <p>- êîíòåéíåð (<emphasis>container</emphasis>): óïðàâëÿåò íàáîðîì îáúåêòîâ â ïàìÿòè.</p>
   <p>- èòåðàòîð (<emphasis>iterator</emphasis>): îáåñïå÷èâàåò äëÿ àëãîðèòìà ñðåäñòâî äîñòóïà ê ñîäåðæèìîìó êîíòåéíåðà.</p>
   <p>- ôóíêöèîíàëüíûé îáúåêò (<emphasis>function object</emphasis>): èíêàïñóëèðóåò ôóíêöèþ â îáúåêòå äëÿ èñïîëüçîâàíèÿ äðóãèìè êîìïîíåíòàìè.</p>
   <p>- àäàïòåð (<emphasis>adaptor</emphasis>): àäàïòèðóåò êîìïîíåíò äëÿ îáåñïå÷åíèÿ ðàçëè÷íîãî èíòåðôåéñà.</p>
   <p>Òàêîå ðàçäåëåíèå ïîçâîëÿåò íàì óìåíüøèòü êîëè÷åñòâî êîìïîíåíòîâ. Íàïðèìåð, âìåñòî íàïèñàíèÿ ôóíêöèè ïîèñêà ýëåìåíòà äëÿ êàæäîãî âèäà êîíòåéíåðà ìû îáåñïå÷èâàåì åäèíñòâåííóþ âåðñèþ, êîòîðàÿ ðàáîòàåò ñ êàæäûì èç íèõ, ïîêà óäîâëåòâîðÿåòñÿ îñíîâíîé íàáîð òðåáîâàíèé.</p>
   <p>Ñëåäóþùåå îïèñàíèå ðàçúÿñíÿåò ñòðóêòóðó áèáëèîòåêè. Åñëè ïðîãðàììíûå êîìïîíåíòû ñâåäåíû â òàáëèöó êàê òð¸õìåðíûé ìàññèâ, ãäå îäíî èçìåðåíèå ïðåäñòàâëÿåò ðàçëè÷íûå òèïû äàííûõ (íàïðèìåð, int, double), âòîðîå èçìåðåíèå ïðåäñòàâëÿåò ðàçëè÷íûå êîíòåéíåðû (íàïðèìåð, âåêòîð, ñâÿçíûé ñïèñîê, ôàéë), à òðåòüå èçìåðåíèå ïðåäñòàâëÿåò ðàçëè÷íûå àëãîðèòìû ñ êîíòåéíåðàìè (íàïðèìåð, ïîèñê, ñîðòèðîâêà, ïåðåìåùåíèå ïî êðóãó), åñëè i, j è k - ðàçìåðû èçìåðåíèé, òîãäà äîëæíî áûòü ðàçðàáîòàíî i* j *k ðàçëè÷íûõ âåðñèé êîäà. Ïðè èñïîëüçîâàíèè øàáëîííûõ ôóíêöèé, êîòîðûå áåðóò ïàðàìåòðàìè òèïû äàííûõ, íàì íóæíî òîëüêî j * k âåðñèé. Äàëåå, åñëè çàñòàâèì íàøè àëãîðèòìû ðàáîòàòü ñ ðàçëè÷íûìè êîíòåéíåðàìè, òî íàì íóæíî ïðîñòî j+k âåðñèé. Ýòî çíà÷èòåëüíî óïðîùàåò ðàçðàáîòêó ïðîãðàìì, à òàêæå ïîçâîëÿåò î÷åíü ãèáêèì ñïîñîáîì èñïîëüçîâàòü êîìïîíåíòû â áèáëèîòåêå âìåñòå ñ îïðåäåëÿåìûìè ïîëüçîâàòåëåì êîìïîíåíòàìè. Ïîëüçîâàòåëü ìîæåò ëåãêî îïðåäåëèòü ñïåöèàëèçèðîâàííûé êîíòåéíåðíûé êëàññ è èñïîëüçîâàòü äëÿ íåãî áèáëèîòå÷íóþ ôóíêöèþ ñîðòèðîâêè. Äëÿ ñîðòèðîâêè ïîëüçîâàòåëü ìîæåò âûáðàòü êàêóþ-òî äðóãóþ ôóíêöèþ ñðàâíåíèÿ ëèáî ÷åðåç îáû÷íûé óêàçàòåëü íà ñðàâíèâàþùóþ ôóíêöèþ, ëèáî ÷åðåç ôóíêöèîíàëüíûé îáúåêò (îáúåêò, äëÿ êîòîðîãî îïðåäåë¸í operator()), êîòîðûé ñðàâíèâàåò. Åñëè ïîëüçîâàòåëþ íåîáõîäèìî âûïîëíèòü ïåðåäâèæåíèå ÷åðåç êîíòåéíåð â îáðàòíîì íàïðàâëåíèè, òî èñïîëüçóåòñÿ àäàïòåð reverse_iterator.</p>
   <p>Áèáëèîòåêà ðàñøèðÿåò îñíîâíûå ñðåäñòâà C++ ïîñëåäîâàòåëüíûì ñïîñîáîì, òàê ÷òî ïðîãðàììèñòó íà C/C++ ëåãêî íà÷àòü ïîëüçîâàòüñÿ áèáëèîòåêîé. Íàïðèìåð, áèáëèîòåêà ñîäåðæèò øàáëîííóþ ôóíêöèþ merge (ñëèÿíèå). Êîãäà ïîëüçîâàòåëþ íóæíî äâà ìàññèâà a è b îáúåäèíèòü â ñ, òî ýòî ìîæåò áûòü âûïîëíåíî òàê:</p>
   <p><code>int a[1000];</code></p>
   <p><code>int b[2000];</code></p>
   <p><code>int c[3000];</code></p>
   <p><code>…</code></p>
   <p><code>merge(a, a+1000, b, b+2000, c);</code></p>
   <p>Êîãäà ïîëüçîâàòåëü õî÷åò îáúåäèíèòü âåêòîð è ñïèñîê (îáà - øàáëîííûå êëàññû â áèáëèîòåêå) è ïîìåñòèòü ðåçóëüòàò â çàíîâî ðàñïðåäåë¸ííóþ íåèíèöèàëèçèðîâàííóþ ïàìÿòü, òî ýòî ìîæåò áûòü âûïîëíåíî òàê:</p>
   <p><code>vector‹Employee› a;</code></p>
   <p><code>list‹Employee› b;</code></p>
   <p><code>…</code></p>
   <p><code>Employee* ñ = allocate(a.size() + b.size(), (Employee*)0);</code></p>
   <p><code>merge(a.begin(), a.end(), b.begin(), b.end(), raw_storage_iterator‹Employee*, Employee›(c));</code></p>
   <p>ãäå begin() è end() - ôóíêöèè-÷ëåíû êîíòåéíåðîâ, êîòîðûå âîçâðàùàþò ïðàâèëüíûå òèïû èòåðàòîðîâ èëè óêàçàòåëå-ïîäîáíûõ îáúåêòîâ, ïîçâîëÿþùèå merge âûïîëíèòü çàäàíèå, à raw_storage_iterator - àäàïòåð, êîòîðûé ïîçâîëÿåò àëãîðèòìàì ïîìåùàòü ðåçóëüòàòû íåïîñðåäñòâåííî â íåèíèöèàëèçèðîâàííóþ ïàìÿòü, âûçûâàÿ ñîîòâåòñòâóþùèé êîíñòðóêòîð êîïèðîâàíèÿ.</p>
   <p>Âî ìíîãèõ ñëó÷àÿõ ïîëåçíî ïåðåìåùàòüñÿ ÷åðåç ïîòîêè ââîäà-âûâîäà òàêèì æå îáðàçîì, êàê ÷åðåç îáû÷íûå ñòðóêòóðû äàííûõ. Íàïðèìåð, åñëè ìû õîòèì îáúåäèíèòü äâå ñòðóêòóðû äàííûõ è çàòåì ñîõðàíèòü èõ â ôàéëå, áûëî áû õîðîøî èçáåæàòü ñîçäàíèÿ âñïîìîãàòåëüíîé ñòðóêòóðû äàííûõ äëÿ õðàíåíèÿ ðåçóëüòàòà, à ïîìåñòèòü ðåçóëüòàò íåïîñðåäñòâåííî â ñîîòâåòñòâóþùèé ôàéë. Áèáëèîòåêà îáåñïå÷èâàåò è istream_iterator, è ostream_iterator øàáëîííûå êëàññû, ÷òîáû ìíîãèå èç áèáëèîòå÷íûõ àëãîðèòìîâ ìîãëè ðàáîòàòü ñ ïîòîêàìè ââîäà-âûâîäà, êîòîðûå ïðåäñòàâëÿþò îäíîðîäíûå áëîêè äàííûõ. Äàëåå ïðèâîäèòñÿ ïðîãðàììà, êîòîðàÿ ÷èòàåò ôàéë, ñîñòîÿùèé èç öåëûõ ÷èñåë, èç ñòàíäàðòíîãî ââîäà, óäàëÿÿ âñå ÷èñëà, äåëÿùèåñÿ íà ïàðàìåòð êîìàíäû, è çàïèñûâàåò ðåçóëüòàò â ñòàíäàðòíûé âûâîä:</p>
   <p><code>main(int argc, char** argv) {</code></p>
   <p><code> if (argc!= 2) throw("usage: remove_if_divides integer\n ");</code></p>
   <p><code> remove_copy_if(istream_iterator‹int›(cin), istream_iterator‹int›(), ostream_iterator‹int›(cout, "\n"),  not1(bind2nd(modulus‹int›(), atoi(argv[1]))));</code></p>
   <p><code>}</code></p>
   <p>Âñÿ ðàáîòà âûïîëíÿåòñÿ àëãîðèòìîì remove_copy_if, êîòîðûé ÷èòàåò öåëûå ÷èñëà îäíî çà äðóãèì, ïîêà èòåðàòîð ââîäà íå ñòàíîâèòñÿ ðàâíûì <emphasis>end-of-stream</emphasis> (<emphasis>êîíåö-ïîòîêà</emphasis>) èòåðàòîðó, êîòîðûé ñîçäà¸òñÿ êîíñòðóêòîðîì áåç ïàðàìåòðîâ. (Âîîáùå âñå àëãîðèòìû ðàáîòàþò ñïîñîáîì "îòñþäà äîñþäà", èñïîëüçóÿ äâà èòåðàòîðà, êîòîðûå ïîêàçûâàþò íà÷àëî è êîíåö ââîäà.) Ïîòîì remove_copy_if çàïèñûâàåò öåëûå ÷èñëà, êîòîðûå âûäåðæèâàþò ïðîâåðêó, â âûõîäíîé ïîòîê ÷åðåç èòåðàòîð âûâîäà, êîòîðûé ñâÿçàí ñ cout. Â êà÷åñòâå ïðåäèêàòà remove_copy_if èñïîëüçóåò ôóíêöèîíàëüíûé îáúåêò, ñîçäàííûé èç ôóíêöèîíàëüíîãî îáúåêòà modulus‹int›, êîòîðûé áåð¸ò i è j è âîçâðàùàåò i % j êàê áèíàðíûé ïðåäèêàò, è ïðåâðàùàåò â óíàðíûé ïðåäèêàò, èñïîëüçóÿ bind2nd, ÷òîáû ñâÿçàòü âòîðîé ïàðàìåòð ñ ïàðàìåòðîì êîìàíäíîé ñòðîêè atoi(argv[1]). Ïîòîì îòðèöàíèå ýòîãî óíàðíîãî ïðåäèêàòà ïîëó÷àåòñÿ ñ ïîìîùüþ àäàïòåðà ôóíêöèè not1.</p>
   <p>Íåñêîëüêî áîëåå ðåàëèñòè÷íûé ïðèìåð - ôèëüòðóþùàÿ ïðîãðàììà, êîòîðàÿ áåð¸ò ôàéë è áåñïîðÿäî÷íî ïåðåòàñîâûâàåò åãî ñòðîêè.</p>
   <p><code>main(int argc, char**) {</code></p>
   <p><code> if (argc!= 1) throw("usage: shuffle\n");</code></p>
   <p><code> vector‹string› v;</code></p>
   <p><code> copy(istream_iterator‹string›(cin), istream_iterator‹string›(), inserter(v, v.end()));</code></p>
   <p><code> random_shuffle(v.begin(), v.end());</code></p>
   <p><code> copy(v.begin(), v.end(), ostream_iterator‹string›(cout));</code></p>
   <p><code>}</code></p>
   <p>Â ýòîì ïðèìåðå copy ïåðåìåùàåò ñòðîêè èç ñòàíäàðòíîãî ââîäà â âåêòîð, íî òàê êàê âåêòîð ïðåäâàðèòåëüíî íå ðàçìåù¸í â ïàìÿòè, èñïîëüçóåòñÿ èòåðàòîð âñòàâêè, ÷òîáû âñòàâèòü â âåêòîð ñòðîêè îäíó çà äðóãîé. (Ýòà ìåòîäèêà ïîçâîëÿåò âñåì ôóíêöèÿì êîïèðîâàíèÿ ðàáîòàòü â îáû÷íîì ðåæèìå çàìåíû òàêæå, êàê â ðåæèìå âñòàâêè.) Ïîòîì random_shuffle ïåðåòàñîâûâàåò âåêòîð, à äðóãîé âûçîâ copy êîïèðóåò åãî â ïîòîê cout.</p>
  </section>
  <section>
   <title>
    <p>Òðåáîâàíèÿ</p>
   </title>
   <p>Äëÿ ãàðàíòèè ñîâìåñòíîé ðàáîòû ðàçëè÷íûå êîìïîíåíòû áèáëèîòåêè äîëæíû óäîâëåòâîðÿòü íåêîòîðûì îñíîâíûì òðåáîâàíèÿì. Òðåáîâàíèÿ äîëæíû áûòü îáùèìè, íàñêîëüêî ýòî âîçìîæíî, òàê ÷òî âìåñòî âûñêàçûâàíèÿ "êëàññ X äîëæåí îïðåäåëèòü ôóíêöèþ-÷ëåí operator++() ", ìû ãîâîðèì "äëÿ ëþáîãî îáúåêòà x êëàññà X îïðåäåë¸í ++x ". (Íå îïðåäåëåíî, ÿâëÿåòñÿ ëè îïåðàòîð ÷ëåíîì èëè ãëîáàëüíîé ôóíêöèåé.) Òðåáîâàíèÿ óñòàíîâëåíû â òåðìèíàõ ÷¸òêèõ âûðàæåíèé, êîòîðûå îïðåäåëÿþò äîïóñòèìûå óñëîâèÿ òèïîâ, óäîâëåòâîðÿþùèõ òðåáîâàíèÿì. Äëÿ êàæäîãî íàáîðà òðåáîâàíèé èìååòñÿ òàáëèöà, êîòîðàÿ îïðåäåëÿåò íà÷àëüíûé íàáîð äîïóñòèìûõ âûðàæåíèé è èõ ñåìàíòèêó. Ëþáîé îáîáù¸ííûé àëãîðèòì, êîòîðûé èñïîëüçóåò òðåáîâàíèÿ, äîëæåí áûòü íàïèñàí â òåðìèíàõ äîïóñòèìûõ âûðàæåíèé äëÿ ñâîèõ ôîðìàëüíûõ ïàðàìåòðîâ.</p>
   <p>Åñëè òðåáóåòñÿ, ÷òîáû áûëà îïåðàöèÿ ëèíåéíîãî âðåìåíè ñëîæíîñòè, ýòî çíà÷èò - íå õóæå, ÷åì ëèíåéíîãî âðåìåíè, è îïåðàöèÿ ïîñòîÿííîãî âðåìåíè óäîâëåòâîðÿåò òðåáîâàíèþ.</p>
   <p>Â íåêîòîðûõ ñëó÷àÿõ ìû ïðåäñòàâèëè ñåìàíòè÷åñêèå òðåáîâàíèÿ, èñïîëüçóþùèå êîä C++. Òàêîé êîä ïðåäíàçíà÷åí êàê ñïåöèôèêàöèÿ ýêâèâàëåíòíîñòè îäíîé êîíñòðóêöèè äðóãîé, íå îáÿçàòåëüíî êàê ñïîñîá, êîòîðûì êîíñòðóêöèÿ äîëæíà áûòü ðåàëèçîâàíà (õîòÿ â íåêîòîðûõ ñëó÷àÿõ äàííûé êîä, îäíîçíà÷íî, ÿâëÿåòñÿ îïòèìàëüíîé ðåàëèçàöèåé).</p>
  </section>
  <section>
   <title>
    <p>Îñíîâíûå êîìïîíåíòû</p>
   </title>
   <section>
    <p>Ýòîò ðàçäåë ñîäåðæèò íåêîòîðûå îñíîâíûå øàáëîííûå ôóíêöèè è êëàññû, êîòîðûå èñïîëüçóþòñÿ â îñòàëüíîé ÷àñòè áèáëèîòåêè.</p>
   </section>
   <section>
    <title>
     <p>Îïåðàòîðû (Operators)</p>
    </title>
    <p>×òîáû èçáåæàòü èçáûòî÷íûõ îïðåäåëåíèé operator!= èç operator== è operator›, ‹=, ›= èç operator‹, áèáëèîòåêà îáåñïå÷èâàåò ñëåäóþùåå:</p>
    <p><code>template ‹class Tl, class T2›</code></p>
    <p><code>inline bool operator!=(const T1&amp; x, const T2&amp; y) {</code></p>
    <p><code> return !(x == y);</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>template ‹class Tl, class T2›</code></p>
    <p><code>inline bool operator›(const T1&amp; x, const T2&amp; y) {</code></p>
    <p><code> return y ‹ x;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>template ‹class Tl, class T2›</code></p>
    <p><code>inline bool operator‹=(const T1&amp; x, const T2&amp; y) {</code></p>
    <p><code> return !(y ‹ x);</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>template ‹class Tl, class T2›</code></p>
    <p><code>inline bool operator›=(const T1&amp; x, const T2&amp; y) {</code></p>
    <p><code> return !(x ‹ y);</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>Ïàðà (Pair)</p>
    </title>
    <p>Áèáëèîòåêà âêëþ÷àåò øàáëîíû äëÿ ðàçíîðîäíûõ ïàð çíà÷åíèé.</p>
    <p><code>template ‹class T1, class T2›</code></p>
    <p><code>struct pair {</code></p>
    <p><code> T1 first;</code></p>
    <p><code> T2 second;</code></p>
    <p><code> pair() {}</code></p>
    <p><code> pair(const T1&amp; x, const T2&amp; y): first(x), second(y) {}</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>template ‹class T1, class T2›</code></p>
    <p><code>inline bool operator==(const pair‹Tl,T2›&amp; x, const pair‹Tl,T2›&amp; y) {</code></p>
    <p><code> return x.first == y.first &amp;&amp; x.second == y.second;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>template ‹class T1, class T2›</code></p>
    <p><code>inline bool operator‹(const pair‹Tl,T2›&amp; x, const pair‹Tl,T2›&amp; y) {</code></p>
    <p><code> return x.first ‹ y.first || (!(y.first ‹ x.first) &amp;&amp; x.second ‹ y.second);</code></p>
    <p><code>}</code></p>
    <p>Áèáëèîòåêà îáåñïå÷èâàåò ñîîòâåòñòâóþùóþ øàáëîííóþ ôóíêöèþ make_pair, ÷òîáû óïðîñòèòü êîíñòðóêöèþ ïàð. Âìåñòî âûðàæåíèÿ, íàïðèìåð:</p>
    <p><code>return pair‹int, double›(5, 3.1415926); // ÿâíûå òèïû,</code></p>
    <p>ìîæíî íàïèñàòü</p>
    <p><code>return make_pair(5, 3.1415926); // òèïû âûâîäÿòñÿ.</code></p>
    <empty-line/>
    <p><code>template ‹class Tl, class T2›</code></p>
    <p><code>inline pair‹Tl,T2› make_pair(const T1&amp; x, const T2&amp; y) {</code></p>
    <p><code> return pair‹Tl,T2›(x, y);</code></p>
    <p><code>}</code></p>
   </section>
  </section>
  <section>
   <title>
    <p>Èòåðàòîðû</p>
   </title>
   <section>
    <p>Èòåðàòîðû - ýòî îáîáùåíèå óêàçàòåëåé, êîòîðûå ïîçâîëÿþò ïðîãðàììèñòó ðàáîòàòü ñ ðàçëè÷íûìè ñòðóêòóðàìè äàííûõ (êîíòåéíåðàìè) åäèíîîáðàçíûì ñïîñîáîì. ×òîáû ñîçäàòü øàáëîííûå àëãîðèòìû, êîòîðûå ïðàâèëüíî è ýôôåêòèâíî ðàáîòàþò ñ ðàçëè÷íûìè òèïàìè ñòðóêòóð äàííûõ, íàì íóæíî ôîðìàëèçîâàòü íå òîëüêî èíòåðôåéñû, íî òàêæå ñåìàíòèêó è ïðåäïîëîæåíèÿ ñëîæíîñòè èòåðàòîðîâ. Èòåðàòîðû - ýòî îáúåêòû, êîòîðûå èìåþò operator*, âîçâðàùàþùèé çíà÷åíèå íåêîòîðîãî êëàññà èëè âñòðîåííîãî òèïà T, íàçûâàåìîãî <emphasis>çíà÷èìûì òèïîì</emphasis> (<emphasis>value type</emphasis>) èòåðàòîðà. Äëÿ êàæäîãî òèïà èòåðàòîðà X, äëÿ êîòîðîãî îïðåäåëåíî ðàâåíñòâî, èìååòñÿ ñîîòâåòñòâóþùèé çíàêîâûé öåëî÷èñëåííûé òèï, íàçûâàåìûé <emphasis>òèïîì ðàññòîÿíèÿ</emphasis> (<emphasis>distanñe type</emphasis>) èòåðàòîðà.</p>
    <p>Òàê êàê èòåðàòîðû - îáîáùåíèå óêàçàòåëåé, èõ ñåìàíòèêà - îáîáùåíèå ñåìàíòèêè óêàçàòåëåé â C++. Ýòî ãàðàíòèðóåò, ÷òî êàæäàÿ øàáëîííàÿ ôóíêöèÿ, êîòîðàÿ èñïîëüçóåò èòåðàòîðû, ðàáîòàåò ñ îáû÷íûìè óêàçàòåëÿìè. Åñòü ïÿòü êàòåãîðèé èòåðàòîðîâ â çàâèñèìîñòè îò îïåðàöèé, îïðåäåë¸ííûõ äëÿ íèõ: <emphasis>ââîäà</emphasis> (<emphasis>input iterators</emphasis>), <emphasis>âûâîäà</emphasis> (<emphasis>output iterators</emphasis>), <emphasis>ïîñëåäîâàòåëüíûå</emphasis> (<emphasis>forward iterators</emphasis>), <emphasis>äâóíàïðàâëåííûå</emphasis> (<emphasis>bidirectional iterators</emphasis>) è <emphasis>ïðîèçâîëüíîãî äîñòóïà</emphasis> (<emphasis>random access iterators</emphasis>.) Ïîñëåäîâàòåëüíûå èòåðàòîðû óäîâëåòâîðÿþò âñåì òðåáîâàíèÿì èòåðàòîðîâ ââîäà è âûâîäà è ìîãóò èñïîëüçîâàòüñÿ âñÿêèé ðàç, êîãäà îïðåäåëÿåòñÿ òîò èëè äðóãîé âèä. Äâóíàïðàâëåííûå èòåðàòîðû óäîâëåòâîðÿþò âñåì òðåáîâàíèÿì ïîñëåäîâàòåëüíûõ èòåðàòîðîâ è ìîãóò èñïîëüçîâàòüñÿ âñÿêèé ðàç, êîãäà îïðåäåëÿåòñÿ ïîñëåäîâàòåëüíûé èòåðàòîð. Èòåðàòîðû ïðîèçâîëüíîãî äîñòóïà óäîâëåòâîðÿþò âñåì òðåáîâàíèÿì äâóíàïðàâëåííûõ èòåðàòîðîâ è ìîãóò èñïîëüçîâàòüñÿ âñÿêèé ðàç, êîãäà îïðåäåëÿåòñÿ äâóíàïðàâëåííûé èòåðàòîð. Èìååòñÿ äîïîëíèòåëüíûé àòðèáóò, êîòîðûé ìîãëè áûòü èìåòü ïîñëåäîâàòåëüíûå, äâóíàïðàâëåííûå è ïðîèçâîëüíîãî äîñòóïà èòåðàòîðû, òî åñòü îíè ìîãóò áûòü <emphasis>ìîäèôèöèðóåìûå</emphasis> (<emphasis>mutable</emphasis>) èëè <emphasis>ïîñòîÿííûå</emphasis> (<emphasis>constant</emphasis>) â çàâèñèìîñòè îò òîãî, âåä¸ò ëè ñåáÿ ðåçóëüòàò operator* êàê ññûëêà èëè êàê ññûëêà íà êîíñòàíòó. Ïîñòîÿííûå èòåðàòîðû íå óäîâëåòâîðÿþò òðåáîâàíèÿì èòåðàòîðîâ âûâîäà.</p>
    <p><strong>Òàáëèöà 1. Îòíîøåíèÿ ñðåäè êàòåãîðèé èòåðàòîðîâ</strong> </p>
    <table>
     <tr align="left">
      <td rowspan="2" align="left" valign="top">Ïðîèçâîëüíîãî äîñòóïà -› Äâóíàïðàâëåííûå -› Ïîñëåäîâàòåëüíûå --&gt; </td>
      <td align="left" valign="top">- › Ââîäà </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">- › Âûâîäà</td>
     </tr>
    </table>
    <p>Òî÷íî òàêæå, êàê îáû÷íûé óêàçàòåëü íà ìàññèâ ãàðàíòèðóåò, ÷òî èìååòñÿ çíà÷åíèå óêàçàòåëÿ, óêàçûâàþùåãî çà ïîñëåäíèé ýëåìåíò ìàññèâà, òàê è äëÿ ëþáîãî òèïà èòåðàòîðà èìååòñÿ çíà÷åíèå èòåðàòîðà, êîòîðûé óêàçûâàåò çà ïîñëåäíèé ýëåìåíò ñîîòâåòñòâóþùåãî êîíòåéíåðà. Ýòè çíà÷åíèÿ íàçûâàþòñÿ <emphasis>çàêîíå÷íûìè</emphasis> (<emphasis>past-the-end</emphasis>) çíà÷åíèÿìè. Çíà÷åíèÿ èòåðàòîðà, äëÿ êîòîðûõ operator* îïðåäåë¸í, íàçûâàþòñÿ <emphasis>ðàçûìåíîâûâàåìûìè</emphasis> (<emphasis>dereferenceable</emphasis>). Áèáëèîòåêà íèêîãäà íå äîïóñêàåò, ÷òî çàêîíå÷íûå çíà÷åíèÿ ÿâëÿþòñÿ ðàçûìåíîâûâàåìûìè. Èòåðàòîðû ìîãóò òàêæå èìåòü <emphasis>èñêëþ÷èòåëüíûå</emphasis> (<emphasis>singular</emphasis>) çíà÷åíèÿ, êîòîðûå íå ñâÿçàíû íè ñ êàêèì êîíòåéíåðîì. Íàïðèìåð, ïîñëå îáúÿâëåíèÿ íåèíèöèàëèçèðîâàííîãî óêàçàòåëÿ x (íàïðèìåð, int* x;), âñåãäà äîëæíî ïðåäïîëàãàòüñÿ, ÷òî x èìååò èñêëþ÷èòåëüíîå çíà÷åíèå óêàçàòåëÿ. Ðåçóëüòàòû áîëüøèíñòâà âûðàæåíèé íå îïðåäåëåíû äëÿ èñêëþ÷èòåëüíûõ çíà÷åíèé. Åäèíñòâåííîå èñêëþ÷åíèå - ïðèñâàèâàíèå íåèñêëþ÷èòåëüíîãî çíà÷åíèÿ èòåðàòîðó, êîòîðûé èìååò èñêëþ÷èòåëüíîå çíà÷åíèå. Â ýòîì ñëó÷àå èñêëþ÷èòåëüíîå çíà÷åíèå ïåðåçàïèñûâàåòñÿ òàêèì æå îáðàçîì, êàê ëþáîå äðóãîå çíà÷åíèå. Ðàçûìåíîâûâàåìûå è çàêîíå÷íûå çíà÷åíèÿ âñåãäà ÿâëÿþòñÿ íåèñêëþ÷èòåëüíûìè.</p>
    <p>Èòåðàòîð j íàçûâàåòñÿ <emphasis>äîñòóïíûì</emphasis> (<emphasis>reachable</emphasis>) èç èòåðàòîðà i, åñëè è òîëüêî åñëè èìååòñÿ êîíå÷íàÿ ïîñëåäîâàòåëüíîñòü ïðèìåíåíèé operator++ ê i, êîòîðàÿ äåëàåò i==j. Åñëè i è j îòíîñÿòñÿ ê îäíîìó è òîìó æå êîíòåéíåðó, òîãäà èëè j äîñòóïåí èç i, èëè i äîñòóïåí èç j, èëè îáà äîñòóïíû (i==j).</p>
    <p>Áîëüøèíñòâî àëãîðèòìè÷åñêèõ øàáëîíîâ áèáëèîòåêè, êîòîðûå ðàáîòàþò ñî ñòðóêòóðàìè äàííûõ, èìåþò èíòåðôåéñû, êîòîðûå èñïîëüçóþò äèàïàçîíû. Äèàïàçîí - ýòî ïàðà èòåðàòîðîâ, êîòîðûå óêàçûâàþò íà÷àëî è êîíåö âû÷èñëåíèÿ. Èíòåðâàë [i,i) - ïóñòîé äèàïàçîí; âîîáùå, äèàïàçîí [i,j) îòíîñèòñÿ ê ýëåìåíòàì â ñòðóêòóðå äàííûõ, íà÷èíàÿ ñ ýëåìåíòà, óêàçûâàåìîãî i, è äî ýëåìåíòà, íî íå âêëþ÷àÿ åãî, óêàçûâàåìîãî j. Äèàïàçîí [i,j) äîïóñòèì, åñëè è òîëüêî åñëè j äîñòóïåí èç i. Ðåçóëüòàò ïðèìåíåíèÿ àëãîðèòìîâ áèáëèîòåêè ê íåäîïóñòèìûì äèàïàçîíàì íå îïðåäåë¸í.</p>
    <p>Âñå êàòåãîðèè èòåðàòîðîâ òðåáóþò òîëüêî òå ôóíêöèè, êîòîðûå îñóùåñòâèìû äëÿ äàííîé êàòåãîðèè ñî ñëîæíîñòüþ ïîñòîÿííîãî âðåìåíè (àìîðòèçèðîâàííûå). Ïîýòîìó òàáëèöû òðåáîâàíèé äëÿ èòåðàòîðîâ íå èìåþò ñòîëáöà ñëîæíîñòè.</p>
    <p>Â ñëåäóþùèõ ðàçäåëàõ ìû ïðèíèìàåì: a è b - çíà÷åíèÿ X, n - çíà÷åíèå òèïà ðàññòîÿíèÿ Distance, u, tmp è m - èäåíòèôèêàòîðû, r è s - ëåâîäîïóñòèìûå (lvalues) çíà÷åíèÿ X, t - çíà÷åíèå çíà÷èìîãî òèïà T.</p>
   </section>
   <section>
    <title>
     <p>Èòåðàòîðû ââîäà (Input iterators)</p>
    </title>
    <p>Êëàññ èëè âñòðîåííûé òèï X óäîâëåòâîðÿåò òðåáîâàíèÿì èòåðàòîðà ââîäà äëÿ çíà÷èìîãî òèïà T, åñëè ñïðàâåäëèâû ñëåäóþùèå âûðàæåíèÿ:</p>
    <p><strong>Òàáëèöà 2. Òðåáîâàíèÿ èòåðàòîðà ââîäà</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
      <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X(a)</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">X(a) - êîïèÿ a. ïðèìå÷àíèå: ïðåäïîëàãàåòñÿ äåñòðóêòîð. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X u(a); <emphasis>X u = a; </emphasis></td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">ïîñëå: u - êîïèÿ a.</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">u = a </td>
      <td align="left" valign="top">X&amp;</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">ïîñëå: u - êîïèÿ a. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a == b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">åñëè a - êîïèÿ b, òîãäà a == b âîçâðàùàåò true. == - ýòî îòíîøåíèå ýêâèâàëåíòíîñòè â îáëàñòè äåéñòâèÿ ==. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a!= b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">!(a == b)</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">*a </td>
      <td align="left" valign="top">îáðàòèìûé â T</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">äî: a - ðàçûìåíîâûâàåìîå. åñëè a - êîïèÿ b, òî *a ýêâèâàëåíòíî *b. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">++r </td>
      <td align="left" valign="top">X&amp;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">äî: r - ðàçûìåíîâûâàåìîå. ïîñëå: r - ðàçûìåíîâûâàåìîå èëè r - çàêîíå÷íîå. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">void r++ </td>
      <td align="left" valign="top">void </td>
      <td align="left" valign="top">void ++r</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">*r++ </td>
      <td align="left" valign="top">Ò </td>
      <td align="left" valign="top">{X tmp = r; ++r; return tmp;}</td>
      <td align="left" valign="top">-</td>
     </tr>
    </table>
    <p><strong>ÏÐÈÌÅ×ÀÍÈÅ.</strong> Äëÿ èòåðàòîðîâ ââîäà íåò íèêàêèõ òðåáîâàíèé íà òèï èëè çíà÷åíèå r++ êðîìå òðåáîâàíèÿ, ÷òîáû *r++ ðàáîòàë ñîîòâåòñòâåííûì îáðàçîì. Â ÷àñòíîñòè, r == s íå ïîäðàçóìåâàåò, ÷òî ++r == ++s. (Ðàâåíñòâî íå ãàðàíòèðóåò ñâîéñòâî çàìåíû èëè ññûëî÷íîé ïðîçðà÷íîñòè.) ×òî êàñàåòñÿ ++r, òî íåò áîëüøå íèêàêèõ òðåáîâàíèé íà çíà÷åíèÿ ëþáûõ êîïèé r çà èñêëþ÷åíèåì òîãî, ÷òî îíè ìîãóò áûòü áåçîïàñíî óíè÷òîæåíû èëè ïðèñâîåíû. Ïîñëå âûïîëíåíèÿ ++r íå òðåáóåòñÿ, ÷òîáû áûëè êîïèè (ïðåäûäóùåãî) r â îáëàñòè ==. Àëãîðèòìû ñ èòåðàòîðàìè ââîäà íèêîãäà íå äîëæíû ïûòàòüñÿ ïðîõîäèòü ÷åðåç òîò æå ñàìûé èòåðàòîð äâàæäû. Îíè äîëæíû áûòü <emphasis>îäíîïðîõîäíûìè</emphasis> (<emphasis>single pass</emphasis>) àëãîðèòìàìè. <emphasis>Íå òðåáóåòñÿ, ÷òîáû çíà÷èìûé òèï T áûë ëåâîäîïóñòèìûì òèïîì (lvalue type)</emphasis>. Ýòè àëãîðèòìû ìîãóò èñïîëüçîâàòüñÿ ñ âõîäíûìè ïîòîêàìè êàê èñòî÷íèêàìè âõîäíûõ äàííûõ ÷åðåç êëàññ istream_iterator.</p>
   </section>
   <section>
    <title>
     <p>Èòåðàòîðû âûâîäà (Output iterators)</p>
    </title>
    <p>Êëàññ èëè âñòðîåííûé òèï X óäîâëåòâîðÿåò òðåáîâàíèÿì èòåðàòîðà âûâîäà, åñëè ñïðàâåäëèâû ñëåäóþùèå âûðàæåíèÿ:</p>
    <p><strong>Òàáëèöà 3. Òðåáîâàíèÿ èòåðàòîðà âûâîäà</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
      <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X(a)</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">*a = t ýêâèâàëåíòíî *X(a) = t. ïðèìå÷àíèå: ïðåäïîëàãàåòñÿ äåñòðóêòîð. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X u(a); <emphasis>X u = a; </emphasis></td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">*a = t </td>
      <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">++r </td>
      <td align="left" valign="top">X&amp;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">r++ </td>
      <td align="left" valign="top">Õ èëè Õ&amp;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
     </tr>
    </table>
    <p><strong>ÏÐÈÌÅ×ÀÍÈÅ.</strong> Åäèíñòâåííîå äîïóñòèìîå èñïîëüçîâàíèå operator* - íà ëåâîé ñòîðîíå âûðàæåíèÿ ïðèñâàèâàíèÿ. <emphasis>Ïðèñâàèâàíèå ÷åðåç òî æå ñàìîå çíà÷åíèå èòåðàòîðà ïðîèñõîäèò òîëüêî îäíàæäû</emphasis>. Àëãîðèòìû ñ èòåðàòîðàìè âûâîäà íèêîãäà íå äîëæíû ïûòàòüñÿ ïðîõîäèòü ÷åðåç òîò æå ñàìûé èòåðàòîð äâàæäû. Îíè äîëæíû áûòü <emphasis>îäíîïðîõîäíûìè</emphasis> (<emphasis>single pass</emphasis>) àëãîðèòìàìè. Ðàâåíñòâî è íåðàâåíñòâî íå îáÿçàòåëüíî îïðåäåëåíû. Àëãîðèòìû, êîòîðûå áåðóò èòåðàòîðû âûâîäà, ìîãóò èñïîëüçîâàòüñÿ ñ âûõîäíûìè ïîòîêàìè äëÿ ïîìåùåíèÿ â íèõ äàííûõ ÷åðåç êëàññ ostream_iterator, òàêæå êàê ñ èòåðàòîðàìè âñòàâêè è âñòàâëÿþùèìè óêàçàòåëÿìè. Â ÷àñòíîñòè, ñëåäóþùèå äâà óñëîâèÿ äîëæíû ñîáëþäàòüñÿ: âî-ïåðâûõ, ÷åðåç ëþáîå çíà÷åíèå èòåðàòîðà äîëæíî âûïîëíÿòüñÿ ïðèñâàèâàíèå äî åãî óâåëè÷åíèÿ (òî åñòü, äëÿ èòåðàòîðà âûâîäà i íåäîïóñòèìà ïîñëåäîâàòåëüíîñòü êîäà i++; i++;); âî-âòîðûõ, ëþáîå çíà÷åíèå èòåðàòîðà âûâîäà ìîæåò èìåòü òîëüêî îäíó àêòèâíóþ êîïèþ â ëþáîå äàííîå âðåìÿ (íàïðèìåð, íåäîïóñòèìà ïîñëåäîâàòåëüíîñòü êîäà i = j; *++i = a; *j = b;).</p>
   </section>
   <section>
    <title>
     <p>Ïîñëåäîâàòåëüíûå èòåðàòîðû (Forward iterators)</p>
    </title>
    <p>Êëàññ èëè âñòðîåííûé òèï X óäîâëåòâîðÿåò òðåáîâàíèÿì ïîñëåäîâàòåëüíîãî èòåðàòîðà, åñëè ñïðàâåäëèâû ñëåäóþùèå âûðàæåíèÿ:</p>
    <p><strong>Òàáëèöà 4. Òðåáîâàíèÿ ïîñëåäîâàòåëüíîãî èòåðàòîðà</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
      <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå</th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X u;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">ïðèìå÷àíèå: u ìîæåò èìåòü èñêëþ÷èòåëüíîå çíà÷åíèå. ïðèìå÷àíèå: ïðåäïîëàãàåòñÿ äåñòðóêòîð. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X()</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">ïðèìå÷àíèå: X() ìîæåò áûòü èñêëþ÷èòåëüíûì. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X(a);</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">a == X(a) </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X u(a); X u = a;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">X u; u = a; </td>
      <td align="left" valign="top">ïîñëå: u == a. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a == b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">== - ýòî îòíîøåíèå ýêâèâàëåíòíîñòè. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a!= b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">!(a == b)</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">r = a </td>
      <td align="left" valign="top">X&amp;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ïîñëå: r == a. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">*a </td>
      <td align="left" valign="top">îáðàòèìûé â T</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">äî: a - ðàçûìåíîâûâàåìîå. a==b ïîäðàçóìåâàåò *a==*b. Åñëè X - ìîäèôèöèðóåìûé, òî *a = t - äîïóñòèìî. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">++r </td>
      <td align="left" valign="top">X&amp;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">äî: r - ðàçûìåíîâûâàåìîå. ïîñëå: r - ðàçûìåíîâûâàåìîå èëè r - çàêîíå÷íîå. r == s è r - ðàçûìåíîâûâàåìîå ïîäðàçóìåâàåò ++r==++s. &amp;r==&amp;++r. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">r++ </td>
      <td align="left" valign="top">X </td>
      <td align="left" valign="top">{X tmp = r; <emphasis>++ r; return tmp;}</emphasis></td>
      <td align="left" valign="top">- </td>
     </tr>
    </table>
    <p><strong>ÏÐÈÌÅ×ÀÍÈÅ.</strong> Òîò ôàêò, ÷òî r == s ïîäðàçóìåâàåò ++r == ++s (÷òî íåâåðíî äëÿ èòåðàòîðîâ ââîäà è âûâîäà) è ÷òî óäàëåíî îãðàíè÷åíèå íà ÷èñëî ïðèñâàèâàíèé ÷åðåç èòåðàòîð (êîòîðîå ïðèìåíÿåòñÿ ê èòåðàòîðàì âûâîäà), ïîçâîëÿåò èñïîëüçîâàíèå ìíîãîïðîõîäíûõ îäíîíàïðàâëåííûõ àëãîðèòìîâ ñ ïîñëåäîâàòåëüíûìè èòåðàòîðàìè.</p>
   </section>
   <section>
    <title>
     <p>Äâóíàïðàâëåííûå èòåðàòîðû (Bidirectional iterators)</p>
    </title>
    <p>Êëàññ èëè âñòðîåííûé òèï X óäîâëåòâîðÿåò òðåáîâàíèÿì äâóíàïðàâëåííîãî èòåðàòîðà, åñëè ê òàáëèöå, êîòîðàÿ îïðåäåëÿåò ïîñëåäîâàòåëüíûå èòåðàòîðû, ìû äîáàâèì ñëåäóþùèå ñòðîêè:</p>
    <p><strong>Òàáëèöà 5. Òðåáîâàíèÿ äâóíàïðàâëåííîãî èòåðàòîðà (â äîïîëíåíèå ê ïîñëåäîâàòåëüíîìó èòåðàòîðó)</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
      <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">--r </td>
      <td align="left" valign="top">X&amp;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">äî: ñóùåñòâóåò s òàêîå, ÷òî r==++s. ïîñëå: s - ðàçûìåíîâûâàåìîå. --(++r)==r. --r==--s ïîäðàçóìåâàåò r==s.&amp;r==&amp;--r. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">r-- </td>
      <td align="left" valign="top">X </td>
      <td align="left" valign="top">{X tmp = r; -<emphasis>-r; return tmp;}</emphasis></td>
      <td align="left" valign="top"><emphasis>-</emphasis> </td>
     </tr>
    </table>
    <p><strong>ÏÐÈÌÅ×ÀÍÈÅ.</strong> Äâóíàïðàâëåííûå èòåðàòîðû ïîçâîëÿþò àëãîðèòìàì ïåðåìåùàòü èòåðàòîðû íàçàä òàê æå, êàê âïåð¸ä.</p>
   </section>
   <section>
    <title>
     <p>Èòåðàòîðû ïðîèçâîëüíîãî äîñòóïà (Random access iterators)</p>
    </title>
    <p>Êëàññ èëè âñòðîåííûé òèï X óäîâëåòâîðÿåò òðåáîâàíèÿì èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà, åñëè ê òàáëèöå, êîòîðàÿ îïðåäåëÿåò äâóíàïðàâëåííûå èòåðàòîðû, ìû äîáàâèì ñëåäóþùèå ñòðîêè:</p>
    <p><strong>Òàáëèöà 6: Òðåáîâàíèÿ èòåðàòîðà ïðîèçâîëüíîãî äîñòóïà (â äîïîëíåíèå ê äâóíàïðàâëåííîìó èòåðàòîðó)</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
      <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">r += n </td>
      <td align="left" valign="top">X&amp; </td>
      <td align="left" valign="top">{Distance m = n; if(m ›= 0) while(m--) ++r; else while(m++) --r; return r;}</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a + n <emphasis>n + a </emphasis></td>
      <td align="left" valign="top">X </td>
      <td align="left" valign="top">{X tmp = a; <emphasis>return tmp += n;} </emphasis></td>
      <td align="left" valign="top">a + n == n + a. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">r -= n</td>
      <td align="left" valign="top">X&amp; </td>
      <td align="left" valign="top">return r += -n;</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a - n </td>
      <td align="left" valign="top">X </td>
      <td align="left" valign="top">{X tmp = a; <emphasis>return tmp -= n;}</emphasis></td>
      <td align="left" valign="top"><emphasis>-</emphasis></td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">b - a </td>
      <td align="left" valign="top">Distance</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">äî: ñóùåñòâóåò çíà÷åíèå n òèïà Distance òàêîå, ÷òî a+n=b. b==a+(b-a). </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a[n] </td>
      <td align="left" valign="top">îáðàòèìûé â T</td>
      <td align="left" valign="top">*(a + n)</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a ‹ b </td>
      <td align="left" valign="top">îáðàòèìûé â bool </td>
      <td align="left" valign="top">b - a › 0 </td>
      <td align="left" valign="top">‹ - ýòî îòíîøåíèå ïîëíîãî óïîðÿäî÷åíèÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a › b </td>
      <td align="left" valign="top">îáðàòèìûé â bool </td>
      <td align="left" valign="top">b ‹ a </td>
      <td align="left" valign="top">› - ýòî îòíîøåíèå ïîëíîãî óïîðÿäî÷åíèÿ, ïðîòèâîïîëîæíîå ‹. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a ›= b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">!(a ‹ b)</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a ‹= b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">!(a › b)</td>
      <td align="left" valign="top">- </td>
     </tr>
    </table>
   </section>
   <section>
    <title>
     <p>Òåãè èòåðàòîðîâ (Iterator tags)</p>
    </title>
    <section>
     <p>×òîáû îñóùåñòâëÿòü àëãîðèòìû òîëüêî â òåðìèíàõ èòåðàòîðîâ, ÷àñòî áûâàåò íåîáõîäèìî âûâåñòè òèï çíà÷åíèÿ è òèï ðàññòîÿíèÿ èç èòåðàòîðà. Äëÿ ðåøåíèÿ ýòîé çàäà÷è òðåáóåòñÿ, ÷òîáû äëÿ èòåðàòîðà i ëþáîé êàòåãîðèè, îòëè÷íîé îò èòåðàòîðà âûâîäà, âûðàæåíèå value_type(i) âîçâðàùàëî (T*)(0), à âûðàæåíèå distance_type(i) âîçâðàùàëî (Distance*)(0). Äëÿ èòåðàòîðîâ âûâîäà ýòè âûðàæåíèÿ íå òðåáóþòñÿ.</p>
    </section>
    <section>
     <title>
      <p>Ïðèìåðû èñïîëüçîâàíèÿ òåãîâ èòåðàòîðîâ</p>
     </title>
     <p>Äëÿ âñåõ òèïîâ îáû÷íûõ óêàçàòåëåé ìû ìîæåì îïðåäåëèòü value_type è distance_type ñ ïîìîùüþ ñëåäóþùåãî:</p>
     <p><code>template ‹class T›</code></p>
     <p><code>inline T* value_type(const T*) {return (T*)(0);}</code></p>
     <empty-line/>
     <p><code>template ‹class T›</code></p>
     <p><code>inline ptrdiff_t* distance_type(const T*) {return (ptrdiff_t*)(0);}</code></p>
     <p>Òîãäà, åñëè ìû õîòèì îñóùåñòâèòü îáîáù¸ííóþ ôóíêöèþ reverse, ìû ïèøåì ñëåäóþùåå:</p>
     <p><code>template ‹class BidirectionalIterator›</code></p>
     <p><code>inline void reverse(BidirectionalIterator first, BidirectionalIterator last) {</code></p>
     <p><code> _reverse(first, last, value_type(first), distance_type(first));</code></p>
     <p><code>}</code></p>
     <p>ãäå _reverse îïðåäåëåíà ñëåäóþùèì îáðàçîì:</p>
     <p><code>template ‹class BidirectionalIterator, class T, class Distance›</code></p>
     <p><code>void _reverse(BidirectionalIterator first, BidirectionalIterator last, T*, Distance*) {</code></p>
     <p><code> Distance n;</code></p>
     <p><code> distance(first, last, n); // ñìîòðè ðàçäåë "Îïåðàöèè ñ èòåðàòîðàìè"</code></p>
     <p><code> --n;</code></p>
     <p><code> while (n › 0) {</code></p>
     <p><code>  T tmp = *first;</code></p>
     <p><code>  *first++ = *--last;</code></p>
     <p><code>  *last = tmp;</code></p>
     <p><code>  n -= 2;</code></p>
     <p><code> }</code></p>
     <p><code>}</code></p>
     <p>Åñëè èìååòñÿ äîïîëíèòåëüíûé òèï óêàçàòåëÿ _huge òàêîé, ÷òî ðàçíîñòü äâóõ óêàçàòåëåé _huge èìååò òèï long long, ìû îïðåäåëÿåì:</p>
     <p><code>template ‹class T›</code></p>
     <p><code>inline T* value_type(const T _huge *) {return (T*) (0);}</code></p>
     <empty-line/>
     <p><code>template ‹class T›</code></p>
     <p><code>inline long long* distance_type(const T _huge *) {</code></p>
     <p><code> return (long long*)(0);</code></p>
     <p><code>}</code></p>
     <p>×àñòî æåëàòåëüíî äëÿ øàáëîííîé ôóíêöèè âûÿñíèòü, êàêîâà íàèáîëåå ñïåöèôè÷íàÿ êàòåãîðèÿ å¸ èòåðàòîðíîãî àðãóìåíòà, òàê ÷òîáû ôóíêöèÿ ìîãëà âûáèðàòü íàèáîëåå ýôôåêòèâíûé àëãîðèòì âî âðåìÿ êîìïèëÿöèè. ×òîáû îáëåã÷èòü ýòî, áèáëèîòåêà ââîäèò êëàññû <emphasis>òåãîâ êàòåãîðèé</emphasis> (<emphasis>category tag</emphasis>), êîòîðûå èñïîëüçóþòñÿ êàê òåãè âðåìåíè êîìïèëÿöèè äëÿ âûáîðà àëãîðèòìà. Ýòî ñëåäóùèå òåãè: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag è random_access_iterator_tag. Êàæäûé èòåðàòîð i äîëæåí èìåòü âûðàæåíèå iterator_category(i), îïðåäåë¸ííîå äëÿ íåãî, êîòîðîå âîçâðàùàåò òåã íàèáîëåå ñïåöèôè÷íîé êàòåãîðèè, êîòîðûé îïèñûâàåò åãî ïîâåäåíèå. Íàïðèìåð, ìû îïðåäåëÿåì, ÷òî âñå òèïû óêàçàòåëåé íàõîäÿòñÿ â êàòåãîðèè èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà:</p>
     <p><code>template ‹class T›</code></p>
     <p><code>inline random_access_iterator_tag iterator_category(const T*) {</code></p>
     <p><code> return random_access_iterator_tag();</code></p>
     <p><code>}</code></p>
     <p>Îïðåäåëÿåìûé ïîëüçîâàòåëåì èòåðàòîð BinaryTreeIterator ìîæåò áûòü âêëþ÷åí â êàòåãîðèþ äâóíàïðàâëåííûõ èòåðàòîðîâ ñëåäóþùèì îáðàçîì:</p>
     <p><code>template ‹class T›</code></p>
     <p><code>inline bidirectional_iterator_tag iterator_category(const BinaryTreeIterator‹T›&amp;) {</code></p>
     <p><code> return bidirectional_iterator_tag();</code></p>
     <p><code>}</code></p>
     <p>Åñëè øàáëîííàÿ ôóíêöèÿ evolve õîðîøî îïðåäåëåíà äëÿ äâóíàïðàâëåííûõ èòåðàòîðîâ, íî ìîæåò áûòü îñóùåñòâëåíà áîëåå ýôôåêòèâíî äëÿ èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà, òîãäà ðåàëèçàöèÿ âûãëÿäèò òàê:</p>
     <p><code>template ‹class BidirectionalIterator›</code></p>
     <p><code>inline void evolve(BidirectionalIterator first, BidirectionalIterator last) {</code></p>
     <p><code> evolve(first, last, iterator_category(first));</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class BidirectionalIterator›</code></p>
     <p><code>void evolve(BidirectionalIterator first, BidirectionalIterator last, bidirectional_iterator_tag) {</code></p>
     <p><code> //… áîëåå óíèâåðñàëüíûé, íî ìåíåå ýôôåêòèâíûé àëãîðèòì</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void evolve(RandomAccessIterator first, RandomAccessIterator last, random_access_iterator_tag) {</code></p>
     <p><code> //… áîëåå ýôôåêòèâíûé, íî ìåíåå óíèâåðñàëüíûé àëãîðèòì</code></p>
     <p><code>}</code></p>
    </section>
    <section>
     <title>
      <p>Ïðèìèòèâû, îïðåäåë¸ííûå â áèáëèîòåêå</p>
     </title>
     <p>×òîáû óïðîñòèòü çàäà÷ó îïðåäåëåíèÿ iterator_category, value_type è distance_type äëÿ îïðåäåëÿåìûõ ïîëüçîâàòåëåì èòåðàòîðîâ, áèáëèîòåêà îáåñïå÷èâàåò ñëåäóþùèå ïðåäîïðåäåë¸ííûå êëàññû è ôóíêöèè:</p>
     <p><code>// iterator tags (òåãè èòåðàòîðîâ)</code></p>
     <p><code>struct input_iterator_tag {};</code></p>
     <p><code>struct output_iterator_tag {};</code></p>
     <p><code>struct forward_iterator_tag {};</code></p>
     <p><code>struct bidirectional_iterator_tag {};</code></p>
     <p><code>struct random_access_iterator_tag {};</code></p>
     <empty-line/>
     <p><code>// iterator bases (áàçîâûå êëàññû èòåðàòîðîâ)</code></p>
     <p><code>template ‹class T, class Distance = ptrdiff_t› struct input_iterator {};</code></p>
     <p><code>struct output_iterator {};</code></p>
     <p><code>// output_iterator íå øàáëîí, ïîòîìó ÷òî ó èòåðàòîðîâ âûâîäà</code></p>
     <p><code>// íå îïðåäåëåíû íè çíà÷èìûé òèï, íè òèï ðàññòîÿíèÿ.</code></p>
     <p><code>template ‹class T, class Distance = ptrdiff_t›</code></p>
     <p><code>struct forward_iterator {};</code></p>
     <p><code>template ‹class T, class Distance = ptrdiff_t›</code></p>
     <p><code>struct bidirectional_iterator {};</code></p>
     <p><code>template ‹class T, class Distance = ptrdiff_t›</code></p>
     <p><code>struct random_access_iterator {};</code></p>
     <empty-line/>
     <p><code>// iterator_category (ôóíêöèè êàòåãîðèé èòåðàòîðîâ)</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline input_iterator_tag iterator_category(const input_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return input_iterator_tag();</code></p>
     <p><code>}</code></p>
     <p><code>inline output_iterator_tag iterator_category(const output_iterator&amp;) {</code></p>
     <p><code> return output_iterator_tag();</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline forward_iterator_tag iterator_category(const forward_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return forward_iterator_tag();</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance› </code></p>
     <p><code>inline bidirectional_iterator_tag iterator_category(const bidirectional_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return bidirectional_iterator_tag();</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline random_access_iterator_tag iterator_category(const random_access_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return random_access_iterator_tag();</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T›</code></p>
     <p><code>inline random_access_iterator_tag iterator_category(const T*) {</code></p>
     <p><code> return random_access_iterator_tag();</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>// value_type of iterator (ôóíêöèè çíà÷èìîãî òèïà èòåðàòîðîâ)</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline T* value_type(const input_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (T*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline T* value_type(const forward_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (T*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline T* value_type(const bidirectional_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (T*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline T* value_type(const random_access_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (T*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T›</code></p>
     <p><code>inline T* value_type(const T*) {return (T*) (0);}</code></p>
     <empty-line/>
     <p><code>// distance_type of iterator (ôóíêöèè òèïà ðàññòîÿíèÿ èòåðàòîðîâ)</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline Distance* distance_type(const input_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (Distance*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline Distance* distance_type(const forward_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (Distance*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline Distance* distance_type(const bidirectional_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (Distance*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T, class Distance›</code></p>
     <p><code>inline Distance* distance_type(const random_access_iterator‹T, Distance›&amp;) {</code></p>
     <p><code> return (Distance*) (0);</code></p>
     <p><code>}</code></p>
     <p><code>template ‹class T›</code></p>
     <p><code>inline ptrdiff_t* distance_type(const T*) {return (ptrdiff_t*) (0);}</code></p>
     <p>Åñëè ïîëüçîâàòåëü õî÷åò îïðåäåëèòü äâóíàïðàâëåííûé èòåðàòîð äëÿ íåêîòîðîé ñòðóêòóðû äàííûõ, ñîäåðæàùåé double, è òàêîé, ÷òîáû ðàáîòàë ñ áîëüøîé (large) ìîäåëüþ ïàìÿòè êîìïüþòåðà, òî ýòî ìîæåò áûòü ñäåëàíî òàêèì îïðåäåëåíèåì:</p>
     <p><code>class MyIterator: public bidirectional_iterator ‹double, long› {</code></p>
     <p><code> // êîä, îñóùåñòâëÿþùèé ++, è ò.ä.</code></p>
     <p><code>};</code></p>
     <p>Òîãäà íåò íåîáõîäèìîñòè îïðåäåëÿòü iterator_category, value_type, è distance_type â MyIterator.</p>
    </section>
   </section>
   <section>
    <title>
     <p>Îïåðàöèè ñ èòåðàòîðàìè (Iterator operations)</p>
    </title>
    <p>Òàê êàê òîëüêî èòåðàòîðû ïðîèçâîëüíîãî äîñòóïà îáåñïå÷èâàþò + è - îïåðàòîðû, áèáëèîòåêà ïðåäîñòàâëÿåò äâå øàáëîííûå ôóíêöèè advance è distance. Ýòè ôóíêöèè èñïîëüçóþò + è - äëÿ èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà (è èìåþò, ïîýòîìó, ñëîæíîñòü ïîñòîÿííîãî âðåìåíè äëÿ íèõ); äëÿ èòåðàòîðîâ ââîäà, ïîñëåäîâàòåëüíûõ è äâóíàïðàâëåííûõ èòåðàòîðîâ ôóíêöèè èñïîëüçóþò ++, ÷òîáû îáåñïå÷èòü ðåàëèçàöèþ ñî ñëîæíîñòüþ ëèíåéíîãî âðåìåíè. advance áåðåò îòðèöàòåëüíûé ïàðàìåòð n òîëüêî äëÿ èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà è äâóíàïðàâëåííûõ èòåðàòîðîâ. advance óâåëè÷èâàåò (èëè óìåíüøàåò äëÿ îòðèöàòåëüíîãî n) èòåðàòîðíóþ ññûëêó i íà n. distance óâåëè÷èâàåò n íà ÷èñëî åäèíèö, ñêîëüêî òðåáóåòñÿ, ÷òîáû äîéòè îò first äî last.</p>
    <p><code>template ‹class InputIterator, class Distance›</code></p>
    <p><code>inline void advance(InputIterator&amp; i, Distance n);</code></p>
    <empty-line/>
    <p><code>template ‹class InputIterator, class Distance›</code></p>
    <p><code>inline void distance(InputIterator first, InputIterator last, Distance&amp; n);</code></p>
    <p>distance äîëæíà áûòü ôóíêöèåé 3-õ ïàðàìåòðîâ, ñîõðàíÿþùåé ðåçóëüòàò â ññûëêå âìåñòî âîçâðàùåíèÿ ðåçóëüòàòà, ïîòîìó ÷òî òèï ðàññòîÿíèÿ íå ìîæåò áûòü âûâåäåí èç âñòðîåííûõ èòåðàòîðíûõ òèïîâ, òàêèõ êàê int*.</p>
   </section>
  </section>
  <section>
   <title>
    <p>Ôóíêöèîíàëüíûå îáúåêòû</p>
   </title>
   <section>
    <p>Ôóíêöèîíàëüíûå îáúåêòû - ýòî îáúåêòû, äëÿ êîòîðûõ îïðåäåë¸í operator(). Îíè âàæíû äëÿ ýôôåêòèâíîãî èñïîëüçîâàíèÿ áèáëèîòåêè. Â ìåñòàõ, ãäå îæèäàåòñÿ ïåðåäà÷à óêàçàòåëÿ íà ôóíêöèþ àëãîðèòìè÷åñêîìó øàáëîíó, èíòåðôåéñ óñòàíîâëåí íà ïðè¸ì îáúåêòà ñ îïðåäåë¸ííûì operator(). Ýòî íå òîëüêî çàñòàâëÿåò àëãîðèòìè÷åñêèå øàáëîíû ðàáîòàòü ñ óêàçàòåëÿìè íà ôóíêöèè, íî òàêæå ïîçâîëÿåò èì ðàáîòàòü ñ ïðîèçâîëüíûìè ôóíêöèîíàëüíûìè îáúåêòàìè. Èñïîëüçîâàíèå ôóíêöèîíàëüíûõ îáúåêòîâ âìåñòå ñ ôóíêöèîíàëüíûìè øàáëîíàìè óâåëè÷èâàåò âûðàçèòåëüíóþ ìîùíîñòü áèáëèîòåêè òàêæå, êàê äåëàåò ðåçóëüòèðóþùèé êîä áîëåå ýôôåêòèâíûì. Íàïðèìåð, åñëè ìû õîòèì ïîýëåìåíòíî ñëîæèòü äâà âåêòîðà a è b, ñîäåðæàùèå double, è ïîìåñòèòü ðåçóëüòàò â a, ìû ìîæåì ñäåëàòü çòî òàê:</p>
    <p><code>transform(a.begin(), a.end(), b.begin(), a.begin(), plus‹double›());</code></p>
    <p>Åñëè ìû õîòèì îòðèöàòü êàæäûé ýëåìåíò a, ìû ìîæåì ñäåëàòü ýòî òàê:</p>
    <p><code>transform(a.begin(), a.end(), a.begin(), negate‹double›());</code></p>
    <p>Ñîîòâåòñòâóþùèå ôóíêöèè âñòàâÿò ñëîæåíèå è îòðèöàíèå.</p>
    <p>×òîáû ïîçâîëèòü àäàïòåðàì è äðóãèì êîìïîíåíòàì ìàíèïóëèðîâàòü ôóíêöèîíàëüíûìè îáúåêòàìè, êîòîðûå èñïîëüçóþò îäèí èëè äâà ïàðàìåòðà, òðåáóåòñÿ, ÷òîáû îíè ñîîòâåòñòâåííî îáåñïå÷èëè îïðåäåëåíèå òèïîâ (typedefs) argument_type è result_type äëÿ ôóíêöèîíàëüíûõ îáúåêòîâ, êîòîðûå èñïîëüçóþò îäèí ïàðàìåòð, è first_argument_type, second_argument_type è result_type äëÿ ôóíêöèîíàëüíûõ îáúåêòîâ, êîòîðûå èñïîëüçóþò äâà ïàðàìåòðà.</p>
   </section>
   <section>
    <title>
     <p>Áàçîâûå êëàññû (Base)</p>
    </title>
    <p>Ñëåäóþùèå êëàññû ïðåäîñòàâëÿþòñÿ, ÷òîáû óïðîñòèòü îïðåäåëåíèå òèïîâ (typedefs) ïàðàìåòðîâ è ðåçóëüòàòà:</p>
    <p><code>template ‹class Arg, class Result›</code></p>
    <p><code>struct unary_function {</code></p>
    <p><code> typedef Arg argument_type;</code></p>
    <p><code> typedef Result result_type;</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>template ‹class Arg1, class Arg2, class Result›</code></p>
    <p><code>struct binary_function {</code></p>
    <p><code> typedef Arg1 first_argument_type;</code></p>
    <p><code> typedef Arg2 second_argument_type;</code></p>
    <p><code> typedef Result result_type;</code></p>
    <p><code>};</code></p>
   </section>
   <section>
    <title>
     <p>Àðèôìåòè÷åñêèå îïåðàöèè (Arithmetic operations)</p>
    </title>
    <p>Áèáëèîòåêà îáåñïå÷èâàåò áàçîâûå êëàññû ôóíêöèîíàëüíûõ îáúåêòîâ äëÿ âñåõ àðèôìåòè÷åñêèõ îïåðàòîðîâ ÿçûêà.</p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct plus: binary_function‹T, T, T› {</code></p>
    <p><code> Ò operator()(const T&amp; x, const T&amp; y) const {return x + y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct minus: binary_function‹T, T, T› {</code></p>
    <p><code> Ò operator()(const T&amp; x, const T&amp; y) const {return x - y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct times: binary_function‹T, T, T› {</code></p>
    <p><code> Ò operator()(const T&amp; x, const T&amp; y) const (return x * y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct divides: binary_function‹T, T, T› {</code></p>
    <p><code> Ò operator()(const T&amp; x, const T&amp; y) const {return x / y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct modulus: binary_function‹T, T, T› {</code></p>
    <p><code> Ò operator()(const T&amp; x, const T&amp; y) const {return x % y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct negate: unary_function‹T, T› {</code></p>
    <p><code> Ò operator()(const T&amp; x) const {return -x;}</code></p>
    <p><code>};</code></p>
   </section>
   <section>
    <title>
     <p>Ñðàâíåíèÿ (Comparisons)</p>
    </title>
    <p>Áèáëèîòåêà îáåñïå÷èâàåò áàçîâûå êëàññû ôóíêöèîíàëüíûõ îáúåêòîâ äëÿ âñåõ îïåðàòîðîâ ñðàâíåíèÿ ÿçûêà</p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct equal_to: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x == y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct not_equal_to: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x!= y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct greater: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x › y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct less: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x ‹ y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct greater_equal: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x ›= y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct less_equal: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x ‹= y;}</code></p>
    <p><code>};</code></p>
   </section>
   <section>
    <title>
     <p>Ëîãè÷åñêèå îïåðàöèè (Logical operations)</p>
    </title>
    <p><code>template ‹class T›</code></p>
    <p><code>struct logical_and: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x&amp;&amp; y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct logical_or: binary_function‹T, T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x, const T&amp; y) const {return x || y;}</code></p>
    <p><code>};</code></p>
    <p><code>template ‹class T›</code></p>
    <p><code>struct logical_not: unary_function‹T, bool› {</code></p>
    <p><code> bool operator()(const T&amp; x) const {return!x;}</code></p>
    <p><code>};</code></p>
   </section>
  </section>
  <section>
   <title>
    <p>Ðàñïðåäåëèòåëè</p>
   </title>
   <section>
    <p>Îäíà èç îáùèõ ïðîáëåì â ìîáèëüíîñòè - ýòî ñïîñîáíîñòü èíêàïñóëèðîâàòü èíôîðìàöèþ îòíîñèòåëüíî ìîäåëè ïàìÿòè. Ýòà èíôîðìàöèÿ âêëþ÷àåò òèïû óêàçàòåëåé, òèï èõ ðàçíîñòè, òèï ðàçìåðà îáúåêòîâ â ýòîé ìîäåëè ïàìÿòè, òàêæå êàê å¸ ïðèìèòèâû âûäåëåíèÿ è îñâîáîæäåíèÿ ïàìÿòè.</p>
    <p>STL ïðèíèìàåòñÿ çà ýòó ïðîáëåìó, îáåñïå÷èâàÿ ñòàíäàðòíûé íàáîð òðåáîâàíèé äëÿ <emphasis>ðàñïðåäåëèòåëåé</emphasis> (<emphasis>allocators</emphasis>), ÿâëÿþùèõñÿ îáúåêòàìè, êîòîðûå èíêàïñóëèðóþò ýòó èíôîðìàöèþ. Âñå êîíòåéíåðû â STL ïàðàìåòðèçîâàíû â òåðìèíàõ ðàñïðåäåëèòåëåé. Ýòî çíà÷èòåëüíî óïðîùàåò çàäà÷ó âçàèìîäåéñòâèÿ ñ ìíîãî÷èñëåííûìè ìîäåëÿìè ïàìÿòè.</p>
   </section>
   <section>
    <title>
     <p>Òðåáîâàíèÿ ðàñïðåäåëèòåëåé (Allocator requirements)</p>
    </title>
    <p>Â ñëåäóþùåé òàáëèöå ìû ïðåäïîëàãàåì, ÷òî X - êëàññ ðàñïðåäåëèòåëåé äëÿ îáúåêòîâ òèïà T, a - çíà÷åíèå X, n èìååò òèï X::size_type, p èìååò òèï X::pointer, r èìååò òèï X::reference è s èìååò òèï X::const_reference.</p>
    <p>Âñå îïåðàöèè c ðàñïðåäåëèòåëÿìè, êàê îæèäàåòñÿ, ñâîäÿòñÿ ê ïîñòîÿííîìó âðåìåíè.</p>
    <p><strong>Òàáëèöà 7. Òðåáîâàíèÿ ðàñïðåäåëèòåëåé</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::value_type </td>
      <td align="left" valign="top">Ò</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::reference </td>
      <td align="left" valign="top">ëåâîäîïóñòèìîå çíà÷åíèå T (lvalue of T)</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::const_reference </td>
      <td align="left" valign="top">const lvalue of T</td>
      <td align="left" valign="top">- </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::pointer </td>
      <td align="left" valign="top">óêàçàòåëü íà òèï T </td>
      <td align="left" valign="top">ðåçóëüòàòîì operator* äëÿ çíà÷åíèé X::pointer ÿâëÿåòñÿ reference. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::const_pointer </td>
      <td align="left" valign="top">óêàçàòåëü íà òèï const T </td>
      <td align="left" valign="top">ðåçóëüòàò operator* äëÿ çíà÷åíèé X::const_pointer &#8213; const_reference; ýòî - òîò æå ñàìûé òèï óêàçàòåëÿ, êàê X::pointer, â ÷àñòíîñòè, sizeof(X::const_pointer)==sizeof(X::pointer). </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X:: size_type </td>
      <td align="left" valign="top">áåççíàêîâûé öåëî÷èñëåííûé òèï </td>
      <td align="left" valign="top">òèï, êîòîðûé ìîæåò ïðåäñòàâëÿòü ðàçìåð ñàìîãî áîëüøîãî îáúåêòà â ìîäåëè ïàìÿòè. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::difference_type </td>
      <td align="left" valign="top">çíàêîâûé öåëî÷èñëåííûé òèï </td>
      <td align="left" valign="top">òèï, êîòîðûé ìîæåò ïðåäñòàâëÿòü ðàçíîñòü ìåæäó äâóìÿ ëþáûìè óêàçàòåëÿìè â ìîäåëè ïàìÿòè. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X a;</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">ïðèìå÷àíèå: ïðåäïîëàãàåòñÿ äåñòðóêòîð. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.address(r) </td>
      <td align="left" valign="top">óêàçàòåëü </td>
      <td align="left" valign="top">*(a.address(r))==r. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.const_address(s) </td>
      <td align="left" valign="top">const_pointer </td>
      <td align="left" valign="top">*(a.address(s))==s. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.allocate(n) </td>
      <td align="left" valign="top">X::pointer </td>
      <td align="left" valign="top">ïàìÿòü ðàñïðåäåëÿåòñÿ äëÿ n îáúåêòîâ òèïà T, íî îáúåêòû íå ñîçäàþòñÿ. allocate ìîæåò âûçûâàòü ñîîòâåòñòâóþùåå èñêëþ÷åíèå. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.deallocate(p) </td>
      <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
      <td align="left" valign="top">âñå îáúåêòû â îáëàñòè, óêàçûâàåìîé p, äîëæíû áûòü óíè÷òîæåíû äî ýòîãî çàïðîñà.</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">construct(p, a) </td>
      <td align="left" valign="top">void </td>
      <td align="left" valign="top">ïîñëå: *p==a. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">destroy(p) </td>
      <td align="left" valign="top">void </td>
      <td align="left" valign="top">çíà÷åíèå, óêàçûâàåìîå p, óíè÷òîæàåòñÿ. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.init_page_size() </td>
      <td align="left" valign="top">X::size_type </td>
      <td align="left" valign="top">âîçâðàù¸ííîå çíà÷åíèå - îïòèìàëüíîå çíà÷åíèå äëÿ íà÷àëüíîãî ðàçìåðà áóôåðà äàííîãî òèïà. Ïðåäïîëàãàåòñÿ, ÷òî åñëè k âîçâðàùåíî ôóíêöèåé init_page_size, t - âðåìÿ êîíñòðóèðîâàíèÿ äëÿ T, è u - âðåìÿ, êîòîðîå òðåáóåòñÿ äëÿ âûïîëíåíèÿ allocate(k), òîãäà k*t áóäåò íàìíîãî áîëüøå, ÷åì u. </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.max_size() </td>
      <td align="left" valign="top">X::size_type </td>
      <td align="left" valign="top">íàèáîëüøåå ïîëîæèòåëüíîå çíà÷åíèå X::difference_type </td>
     </tr>
    </table>
    <p>pointer îòíîñèòñÿ ê êàòåãîðèè ìîäèôèöèðóåìûõ èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà, ññûëàþùèõñÿ íà T. const_pointer îòíîñèòñÿ ê êàòåãîðèè ïîñòîÿííûõ èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà, ññûëàþùèõñÿ íà T. Èìååòñÿ îïðåäåë¸ííîå ïðåîáðàçîâàíèå èç pointer â const_pointer.</p>
    <p>Äëÿ ëþáîãî øàáëîíà ðàñïðåäåëèòåëÿ Alloc èìååòñÿ îïðåäåëåíèå äëÿ òèïà void. Ó Alloc‹void› îïðåäåëåíû òîëüêî êîíñòðóêòîð, äåñòðóêòîð è Alloc‹void›::pointer. Ïðåîáðàçîâàíèÿ îïðåäåëåíû èç ëþáîãî Alloc‹T›::pointer â Alloc‹void›::pointer è îáðàòíî, òàê ÷òî äëÿ ëþáîãî p áóäåò p == Alloc‹T›::pointer(Alloc‹void›::pointer(p)).</p>
   </section>
   <section>
    <title>
     <p>Ðàñïðåäåëèòåëü ïî óìîë÷àíèþ (The default allocator)</p>
    </title>
    <p><code>template ‹class T›</code></p>
    <p><code>class allocator {</code></p>
    <p><code>public:</code></p>
    <p><code> typedef T* pointer;</code></p>
    <p><code> typedef const T* const_pointer;</code></p>
    <p><code> typedef T&amp; reference;</code></p>
    <p><code> typedef const T&amp; const_reference;</code></p>
    <p><code> typedef T value_type;</code></p>
    <p><code> typedef size_t size_type;</code></p>
    <p><code> typedef ptrdiff_t difference_type;</code></p>
    <p><code> allocator();</code></p>
    <p><code> ~allocator();</code></p>
    <p><code> pointer address(reference x);</code></p>
    <p><code> const_pointer const_address(const_reference x);</code></p>
    <p><code> pointer allocate(size_type n);</code></p>
    <p><code> void deallocate(pointer p);</code></p>
    <p><code> size_type init_page_size();</code></p>
    <p><code> size_type max_size();</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>class allocator‹void› {</code></p>
    <p><code>public:</code></p>
    <p><code> typedef void* pointer;</code></p>
    <p><code> allocator();</code></p>
    <p><code> ~allocator();</code></p>
    <p><code>};</code></p>
    <p>Ïðåäïîëàãàåòñÿ, ÷òî â äîïîëíåíèå ê allocator ïîñòàâùèêè áèáëèîòåêè îáåñïå÷èâàþò ðàñïðåäåëèòåëè äëÿ âñåõ ìîäåëåé ïàìÿòè.</p>
   </section>
  </section>
  <section>
   <title>
    <p>Êîíòåéíåðû</p>
   </title>
   <section>
    <p>Êîíòåéíåðû - ýòî îáúåêòû, êîòîðûå ñîäåðæàò äðóãèå îáúåêòû. Îíè óïðàâëÿþò ðàçìåùåíèåì â ïàìÿòè è ñâîáîæäåíèåì ýòèõ îáúåêòîâ ÷åðåç êîíñòðóêòîðû, äåñòðóêòîðû, îïåðàöèè âñòàâêè è óäàëåíèÿ.</p>
    <p>Â ñëåäóþùåé òàáëèöå ìû ïîëàãàåì, ÷òî X - êîíòåéíåðíûé êëàññ, ñîäåðæàùèé îáúåêòû òèïà T, a è b - çíà÷åíèÿ X, u - èäåíòèôèêàòîð, r - çíà÷åíèå X&amp;.</p>
    <p><strong>Òàáëèöà 8. Òðåáîâàíèÿ êîíòåéíåðîâ</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
      <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
      <th align="left" valign="top">ñëîæíîñòü </th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::value_type </td>
      <td align="left" valign="top">Ò</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::reference</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::const_reference</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::pointer </td>
      <td align="left" valign="top">òèï óêàçàòåëÿ, óêàçûâàþùèé íà X::reference</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">óêàçàòåëü íà T â ìîäåëè ïàìÿòè, èñïîëüçóåìîé êîíòåéíåðîì </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::iterator </td>
      <td align="left" valign="top">òèï èòåðàòîðà, óêàçûâàþùèé íà X::reference</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">èòåðàòîð ëþáîé êàòåãîðèè, êðîìå èòåðàòîðà âûâîäà. </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::const_iterator </td>
      <td align="left" valign="top">òèï èòåðàòîðà, óêàçûâàþùèé íà X::<emphasis>const_reference </emphasis></td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ïîñòîÿííûé èòåðàòîð ëþáîé êàòåãîðèè, êðîìå èòåðàòîðà âûâîäà. </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::difference<emphasis>_</emphasis>type</td>
      <td align="left" valign="top">çíàêîâûé öåëî÷èñëåííûé òèï</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">èäåíòè÷åí òèïó ðàññòîÿíèÿ X::iterator è X::const_iterator </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::size_type </td>
      <td align="left" valign="top">áåççíàêîâûé öåëî÷èñëåííûé òèï</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">size_type ìîæåò ïðåäñòàâëÿòü ëþáîå íåîòðèöàòåëüíîå çíà÷åíèå difference_type </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X u;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">ïîñëå: u.size()==0. </td>
      <td align="left" valign="top">ïîñòîÿííàÿ</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X()</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">X().size()==0. </td>
      <td align="left" valign="top">ïîñòîÿííàÿ</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X(a)</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">a==X(a). </td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X u(a); X u==a;</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">X u; u = a; </td>
      <td align="left" valign="top">ïîñëå: u==a. </td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">(&amp;a)-›~X() </td>
      <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ</td>
      <td align="left" valign="top">- </td>
      <td align="left" valign="top">ïîñëå: a.size()==0. ïðèìå÷àíèå: äåñòðóêòîð ïðèìåíÿåòñÿ ê êàæäîìó ýëåìåíòó a, è âñÿ ïàìÿòü âîçâðàùàåòñÿ. </td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.begin() </td>
      <td align="left" valign="top">iterator; const_iterator äëÿ ïîñòîÿííîãî a</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ïîñòîÿííàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.end() </td>
      <td align="left" valign="top">iterator; const_iterator äëÿ ïîñòîÿííîãî a</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ïîñòîÿííàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a==b </td>
      <td align="left" valign="top">îáðàòèìûé â bool </td>
      <td align="left" valign="top">a.size()==b.size() &amp;&amp; equal(a.begin(), a.end(), b.begin())</td>
      <td align="left" valign="top"><emphasis>==</emphasis> - ýòî îòíîøåíèå ýêâèâàëåíòíîñòè. ïðèìå÷àíèå: equal îïðåäåëÿåòñÿ â ðàçäåëå àëãîðèòìîâ. </td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a!= b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">!(a==b)</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">r = a </td>
      <td align="left" valign="top">X&amp; </td>
      <td align="left" valign="top">if(&amp;r!=&amp;a){ (&amp;r)-›X::~X(); new(&amp;r)X(a); return r;}</td>
      <td align="left" valign="top">ïîñëå: r==a.</td>
      <td align="left" valign="top">ëèíåéíaÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.size() </td>
      <td align="left" valign="top">size_type </td>
      <td align="left" valign="top">size_type n = 0; distance(a.begin(), a.end(), n); return n;</td>
      <td align="left" valign="top"><emphasis>-</emphasis></td>
      <td align="left" valign="top">ïîñòîÿííàÿ</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.max_size() </td>
      <td align="left" valign="top">size_type</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">size() ñàìîãî áîëüøîãî âîçìîæíîãî êîíòåéíåðà. </td>
      <td align="left" valign="top">ïîñòîÿííàÿ</td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.empty() </td>
      <td align="left" valign="top">îáðàòèìûé â bool </td>
      <td align="left" valign="top">a.size()==0</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ïîñòîÿííàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a ‹ b </td>
      <td align="left" valign="top">îáðàòèìûé â bool </td>
      <td align="left" valign="top">lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())</td>
      <td align="left" valign="top">äî: ‹ îïðåäåë¸í äëÿ çíà÷åíèé T. ‹ - îòíîøåíèå ïîëíîãî óïîðÿäî÷åíèÿ. lexicographical_compare îïðåäåëÿåòñÿ â ðàçäåëå àëãîðèòìîâ. </td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a › b </td>
      <td align="left" valign="top">îáðàòèìûé â bool </td>
      <td align="left" valign="top">b ‹ a</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ëèíåéíaÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a ‹= b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">!(a › b)</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a ›= b </td>
      <td align="left" valign="top">îáðàòèìûé â bool</td>
      <td align="left" valign="top">!(a ‹ b)</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ëèíåéíàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.swap(b) </td>
      <td align="left" valign="top">void </td>
      <td align="left" valign="top">swap(a, b)</td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">ïîñòîÿííàÿ </td>
     </tr>
    </table>
    <p>Ôóíêöèÿ-÷ëåí size() âîçâðàùàåò ÷èñëî ýëåìåíòîâ â êîíòåéíåðå. Å¸ ñåìàíòèêà îïðåäåëÿåòñÿ ïðàâèëàìè êîíñòðóêòîðîâ, âñòàâîê è óäàëåíèé.</p>
    <p>begin() âîçâðàùàåò èòåðàòîð, ññûëàþùèéñÿ íà ïåðâûé ýëåìåíò â êîíòåéíåðå. end() âîçâðàùàåò èòåðàòîð, êîòîðûé ÿâëÿåòñÿ çàêîíå÷íûì.</p>
    <p>Åñëè òèï èòåðàòîðà êîíòåéíåðà ïðèíàäëåæèò ê êàòåãîðèè äâóíàïðàâëåííûõ èòåðàòîðîâ èëè èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà, òî êîíòåéíåð íàçûâàåòñÿ reversible (îáðàòèìûì) è óäîâëåòâîðÿåò ñëåäóþùèì äîïîëíèòåëüíûì òðåáîâàíèÿì:</p>
    <p><strong>Òàáëèöà 9. Òðåáîâàíèÿ îáðàòèìûõ êîíòåéíåðîâ (â äîïîëíåíèå ê êîíòåéíåðàì)</strong> </p>
    <table>
     <tr align="left">
      <th align="left" valign="top">âûðàæåíèå </th>
      <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
      <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
      <th align="left" valign="top">ñëîæíîñòü </th>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::reverse_iterator </td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">reverse_iterator‹iterator, value_type, reference, difference_type› äëÿ èòåðàòîðà ïðîèçâîëüíîãî äîñòóïà. reverse_bidirectional_iterator‹iterator, value_type, reference, difference_type› äëÿ äâóíàïðàâëåííîãî èòåðàòîðà </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">X::const_reverse_iterator </td>
      <td align="left" valign="top">-</td>
      <td align="left" valign="top">reverse_iterator‹const_iterator, value_type, const_reference, difference_type› äëÿ èòåðàòîðà ïðîèçâîëüíîãî äîñòóïà. reverse_bidirectional_iterator‹const_iterator, value_type, const_reference, difference_type› äëÿ äâóíàïðàâëåííîãî èòåðàòîðà. </td>
      <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.rbegin() </td>
      <td align="left" valign="top">reverse_iterator; const_reverse_iterator äëÿ ïîñòîÿííîãî a </td>
      <td align="left" valign="top">reverse_iterator(end()) </td>
      <td align="left" valign="top">ïîñòîÿííàÿ </td>
     </tr>
     <tr align="left">
      <td align="left" valign="top">a.rend() </td>
      <td align="left" valign="top">reverse_iterator; const_reverse_iterator äëÿ ïîñòîÿííîãî a </td>
      <td align="left" valign="top">reverse_iterator(begin()) </td>
      <td align="left" valign="top">ïîñòîÿííàÿ </td>
     </tr>
    </table>
   </section>
   <section>
    <title>
     <p>Ïîñëåäîâàòåëüíîñòè (Sequences)</p>
    </title>
    <section>
     <p>Ïîñëåäîâàòåëüíîñòü - ýòî âèä êîíòåéíåðà, êîòîðûé îðãàíèçóåò êîíå÷íîå ìíîæåñòâî îáúåêòîâ îäíîãî è òîãî æå òèïà â ñòðîãîì ëèíåéíîì ïîðÿäêå. Áèáëèîòåêà îáåñïå÷èâàåò òðè îñíîâíûõ âèäà ïîñëåäîâàòåëüíûõ êîíòåéíåðîâ: vector (âåêòîð), list (ñïèñîê) è deque (äâóñòîðîííÿÿ î÷åðåäü). Îíà òàêæå ïðåäîñòàâëÿåò êîíòåéíåðíûå àäàïòåðû, êîòîðûå îáëåã÷àþò ñîçäàíèå àáñòðàêòíûõ òèïîâ äàííûõ, òàêèõ êàê ñòåêè èëè î÷åðåäè, èç îñíîâíûõ âèäîâ ïîñëåäîâàòåëüíîñòåé (èëè èç äðóãèõ âèäîâ ïîñëåäîâàòåëüíîñòåé, êîòîðûå ïîëüçîâàòåëü ìîæåò ñàì îïðåäåëèòü).</p>
     <p>Â ñëåäóþùèõ äâóõ òàáëèöàõ X - ïîñëåäîâàòåëüíûé êëàññ, a - çíà÷åíèå X, i è j óäîâëåòâîðÿþò òðåáîâàíèÿì èòåðàòîðîâ ââîäà, [i, j) - äîïóñòèìûé äèàïàçîí, n - çíà÷åíèå X::size_type, p - äîïóñòèìûé èòåðàòîð äëÿ a, q - ðàçûìåíîâûâàåìûé èòåðàòîð äëÿ a, [q1, q2) - äîïóñòèìûé äèàïàçîí â a, t - çíà÷åíèå X::value_type.</p>
     <p>Ñëîæíîñòè âûðàæåíèé çàâèñÿò îò ïîñëåäîâàòåëüíîñòåé.</p>
     <p><strong>Òàáëèöà 10. Òðåáîâàíèÿ ïîñëåäîâàòåëüíîñòåé (â äîïîëíåíèå ê êîíòåéíåðàì)</strong> </p>
     <empty-line/>
     <table>
      <tr align="left">
       <th align="left" valign="top">âûðàæåíèå </th>
       <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
       <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X(n, t) X a(n, t); </td>
       <td align="left" valign="top">-</td>
       <td align="left" valign="top">ïîñëå: size()==n. ñîçäà¸ò ïîñëåäîâàòåëüíîñòü ñ n êîïèÿìè t. </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X(i, j) X a(i, j); </td>
       <td align="left" valign="top">-</td>
       <td align="left" valign="top">ïîñëå: size()==ðàññòîÿíèþ ìåæäó i è j. ñîçäà¸ò ïîñëåäîâàòåëüíîñòü, ðàâíóþ äèàïàçîíó [i, j). </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.insert(p, t) </td>
       <td align="left" valign="top">iterator </td>
       <td align="left" valign="top">âñòàâëÿåò êîïèþ t ïåðåä p. âîçâðàùàåìîå çíà÷åíèå óêàçûâàåò íà âñòàâëåííóþ êîïèþ.</td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.insert(p, n, t) </td>
       <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
       <td align="left" valign="top">âñòàâëÿåò n êîïèé t ïåðåä p. </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.insert(p, i, j) </td>
       <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
       <td align="left" valign="top">âñòàâëÿåò êîïèè ýëåìåíòîâ èç äèàïàçîíà [i, j) ïåðåä p. </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.erase(q) </td>
       <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
       <td align="left" valign="top">óäàëÿåò ýëåìåíò, óêàçûâàåìûé q. </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.erase(ql, q2) </td>
       <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
       <td align="left" valign="top">óäàëÿåò ýëåìåíòû â äèàïàçîíå [ql, q2). </td>
      </tr>
     </table>
     <p>vector (âåêòîð), list (ñïèñîê) è deque (äâóñòîðîííÿÿ î÷åðåäü) âûäâèãàþò ïðîãðàììèñòó ðàçëè÷íûå ïðåäëîæåíèÿ ñëîæíîñòè è äîëæíû èñïîëüçîâàòüñÿ ñîîòâåòñòâåííî. vectîr - òèï ïîñëåäîâàòåëüíîñòè, êîòîðàÿ èñïîëüçóåòñÿ ïî óìîë÷àíèþ. list íóæíî èñïîëüçîâàòü, êîãäà èìåþòñÿ ÷àñòûå âñòàâêè è óäàëåíèÿ èç ñåðåäèíû ïîñëåäîâàòåëüíîñòè, deque - ñòðóêòóðà äàííûõ äëÿ âûáîðà, êîãäà áîëüøèíñòâî âñòàâîê è óäàëåíèé ïðîèñõîäèò â íà÷àëå èëè â êîíöå ïîñëåäîâàòåëüíîñòè.</p>
     <p>Òèïû iterator è const_iterator äëÿ ïîñëåäîâàòåëüíîñòåé äîëæíû áûòü, ïî êðàéíåé ìåðå, èç êàòåãîðèè ïîñëåäîâàòåëüíûõ èòåðàòîðîâ.</p>
     <p><strong>Òàáëèöà 11. Íåîáÿçàòåëüíûå îïåðàöèè ïîñëåäîâàòåëüíîñòåé</strong> </p>
     <table>
      <tr align="left">
       <th align="left" valign="top">âûðàæåíèå </th>
       <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
       <th align="left" valign="top">ñåìàíòèêà èñïîëíåíèÿ </th>
       <th align="left" valign="top">êîíòåéíåð </th>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.front() </td>
       <td align="left" valign="top">reference; const_reference äëÿ ïîñòîÿííîãî a </td>
       <td align="left" valign="top">*a.begin() </td>
       <td align="left" valign="top">vector, list, deque </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.back() </td>
       <td align="left" valign="top">reference; const_reference äëÿ ïîñòîÿííîãî a </td>
       <td align="left" valign="top">*a.(--end()) </td>
       <td align="left" valign="top">vector, list, deque </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.push_front(t) </td>
       <td align="left" valign="top">void </td>
       <td align="left" valign="top">a.insert(a.begin(), t) </td>
       <td align="left" valign="top">list, deque </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.push_back(t) </td>
       <td align="left" valign="top">void </td>
       <td align="left" valign="top">a.insert(a.end(), t) </td>
       <td align="left" valign="top">vector, list, deque</td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.pop_front() </td>
       <td align="left" valign="top">void </td>
       <td align="left" valign="top">a.erase(a.begin()) </td>
       <td align="left" valign="top">list, deque </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.pop_back() </td>
       <td align="left" valign="top">void</td>
       <td align="left" valign="top">a.erase(--a.end()) </td>
       <td align="left" valign="top">vector, list, deque </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a[n] </td>
       <td align="left" valign="top">reference; const_reference äëÿ ïîñòîÿííîãî a </td>
       <td align="left" valign="top">*(a.begin() + n) </td>
       <td align="left" valign="top">vector, deque </td>
      </tr>
     </table>
     <p>Âñå îïåðàöèè â ðàñïîëîæåííîé âûøå òàáëèöå îáåñïå÷èâàþòñÿ òîëüêî äëÿ êîíòåéíåðîâ, äëÿ êîòîðûõ îíè çàíèìàþò ïîñòîÿííîå âðåìÿ.</p>
    </section>
    <section>
     <title>
      <p>Âåêòîð (Vector)</p>
     </title>
     <p>vector - âèä ïîñëåäîâàòåëüíîñòè, êîòîðàÿ ïîääåðæèâàåò èòåðàòîðû ïðîèçâîëüíîãî äîñòóïà. Êðîìå òîãî, îí ïîääåðæèâàåò îïåðàöèè âñòàâêè è óäàëåíèÿ â êîíöå ñ ïîñòîÿííûì (àìîðòèçèðîâàííûì) âðåìåíåì; âñòàâêà è óäàëåíèå â ñåðåäèíå çàíèìàþò ëèíåéíîå âðåìÿ. Óïðàâëåíèå ïàìÿòüþ îáðàáàòûâàåòñÿ àâòîìàòè÷åñêè, õîòÿ äëÿ óëó÷øåíèÿ ýôôåêòèâíîñòè ìîæíî äàâàòü ïîäñêàçêè.</p>
     <p><code>template ‹class T, template ‹class U› class Allocator = allocator›</code></p>
     <p><code>class vector {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // îïðåäåëåíèÿ òèïîâ (typedefs):</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef const_iterator;</code></p>
     <p><code> typedef Allocator‹T›::pointer pointer;</code></p>
     <p><code> typedef Allocator‹T›::reference reference;</code></p>
     <p><code> typedef Allocator‹T›::const_reference const_reference;</code></p>
     <p><code> typedef size_type;</code></p>
     <p><code> typedef difference_type;</code></p>
     <p><code> typedef T value_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_reverse_iterator;</code></p>
     <empty-line/>
     <p><code> // ðàçìåùåíèå/îñâîáîæäåíèå (allocation/deallocation):</code></p>
     <p><code> vector();</code></p>
     <p><code> vector(size_type n, const T&amp; value = T());</code></p>
     <p><code> vector(const vector‹T, Allocator›&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> vector(InputIterator first, InputIterator last);</code></p>
     <p><code> ~vector();</code></p>
     <p><code> vector‹T, Allocator›&amp; operator=(const vector‹T, Allocator›&amp; x);</code></p>
     <p><code> void reserve(size_type n);</code></p>
     <p><code> void swap(vector‹T, Allocator›&amp; x);</code></p>
     <empty-line/>
     <p><code> // ñðåäñòâà äîñòóïà (accessors):</code></p>
     <p><code> iterator begin();</code></p>
     <p><code> const_iterator begin() const;</code></p>
     <p><code> iterator end();</code></p>
     <p><code> const_iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin();</code></p>
     <p><code> const_reverse_iterator rbegin();</code></p>
     <p><code> reverse_iterator rend();</code></p>
     <p><code> const_reverse_iterator rend();</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <p><code> size_type capacity() const;</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> reference operator[](size_type n);</code></p>
     <p><code> const_reference operator[](size_type n) const;</code></p>
     <p><code> reference front();</code></p>
     <p><code> const_reference front() const;</code></p>
     <p><code> reference back();</code></p>
     <p><code> const_reference back() const;</code></p>
     <empty-line/>
     <p><code> // âñòàâêà/ñòèðàíèå (insert/irase):</code></p>
     <p><code> void push_back(const T&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const T&amp; x = T());</code></p>
     <p><code> void insert(iterator position, size_type n, const T&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> void insert(iterator position, InputIterator first, InputIterator last);</code></p>
     <p><code> void pop_back();</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Allocator›</code></p>
     <p><code>bool operator==(const vector‹T, Allocator›&amp; x, const vector‹T, Allocator›&amp; y);</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Allocator›</code></p>
     <p><code>bool operator‹(const vector‹T, Allocator›&amp; x, const vector‹T, Allocator›&amp; y);</code></p>
     <p>iterator - ýòî èòåðàòîð ïðîèçâîëüíîãî äîñòóïà, ññûëàþùèéñÿ íà T. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>const_iterator - ýòî ïîñòîÿííûé èòåðàòîð ïðîèçâîëüíîãî äîñòóïà, ññûëàþùèéñÿ íà const T. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator. Ãàðàíòèðóåòñÿ, ÷òî èìååòñÿ êîíñòðóêòîð äëÿ const_iterator èç iterator.</p>
     <p>size_type - áåççíàêîâûé öåëî÷èñëåííûé òèï. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>difference_type - çíàêîâûé öåëî÷èñëåííûé òèï. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>Êîíñòðóêòîð template ‹class InputIterator› vector(InputIterator first, InputIterator last) äåëàåò òîëüêî N âûçîâîâ êîíñòðóêòîðà êîïèðîâàíèÿ T (ãäå N - ðàññòîÿíèå ìåæäó first è last) è íèêàêèõ ïåðåðàñïðåäåëåíèé, åñëè èòåðàòîðû first è last îòíîñÿòñÿ ê ïîñëåäîâàòåëüíîé, äâóíàïðàâëåííîé èëè ïðîèçâîëüíîãî äîñòóïà êàòåãîðèÿì. Îí äåëàåò, ñàìîå áîëüøåå, 2N âûçîâîâ êîíñòðóêòîðà êîïèðîâàíèÿ T è logN ïåðåðàñïðåäåëåíèé, åñëè îíè - òîëüêî èòåðàòîðû ââîäà, òàê êàê íåâîçìîæíî îïðåäåëèòü ðàññòîÿíèå ìåæäó first è last è çàòåì ñäåëàòü êîïèðîâàíèå.</p>
     <p>Ôóíêöèÿ-÷ëåí capasity (¸ìêîñòü) âîçâðàùàåò ðàçìåð ðàñïðåäåë¸ííîé ïàìÿòè â âåêòîðå. Ôóíêöèÿ-÷ëåí reserve - äèðåêòèâà, êîòîðàÿ ñîîáùàåò vector (âåêòîðó) çàïëàíèðîâàííîe èçìåíåíèå ðàçìåðà, òàê ÷òîáû îí ìîã ñîîòâåòñòâåííî óïðàâëÿòü ðàñïðåäåëåíèåì ïàìÿòè. Ýòî íå èçìåíÿåò ðàçìåð ïîñëåäîâàòåëüíîñòè è çàíèìàåò, ñàìîå áîëüøåå, ëèíåéíîå âðåìÿ îò ðàçìåðà ïîñëåäîâàòåëüíîñòè. Ïåðåðàñïðåäåëåíèå â ýòîì ñëó÷àå ïðîèñõîäèò òîãäà è òîëüêî òîãäà, êîãäà òåêóùàÿ ¸ìêîñòü ìåíüøå, ÷åì ïàðàìåòð reserve. Ïîñëå reserve ¸ìêîñòü (capasity) áîëüøå èëè ðàâíà ïàðàìåòðó reserve, åñëè ïðîèñõîäèò ïåðåðàñïðåäåëåíèå; à èíà÷å ðàâíà ïðåäûäóùåìó çíà÷åíèþ capasity. Ïåðåðàñïðåäåëåíèå äåëàåò íåäåéñòâèòåëüíûìè âñå ññûëêè, óêàçàòåëè è èòåðàòîðû, ññûëàþùèåñÿ íà ýëåìåíòû â ïîñëåäîâàòåëüíîñòè. Ãàðàíòèðóåòñÿ, ÷òî íåò íèêàêîãî ïåðåðàñïðåäåëåíèÿ âî âðåìÿ âñòàâîê, êîòîðûå ïðîèñõîäÿò ïîñëå òîãî, êàê reserve âûïîëíÿåòñÿ, äî âðåìåíè, êîãäà ðàçìåð âåêòîðà äîñòèãàåò ðàçìåðà, óêàçàííîãî reserve.</p>
     <p>insert (âñòàâêà) âûçûâàåò ïåðåðàñïðåäåëåíèå, åñëè íîâûé ðàçìåð áîëüøå, ÷åì ñòàðàÿ ¸ìêîñòü. Åñëè íèêàêîãî ïåðåðàñïðåäåëåíèÿ íå ïðîèñõîäèò, âñå èòåðàòîðû è ññûëêè ïåðåä òî÷êîé âñòàâêè îñòàþòñÿ ñïðàâåäëèâûìè. Âñòàâêà åäèíñòâåííîãî ýëåìåíòà â âåêòîð ëèíåéíà îòíîñèòåëüíî ðàññòîÿíèÿ îò òî÷êè âñòàâêè äî êîíöà âåêòîðà. Àìîðòèçèðîâàííàÿ ñëîæíîñòü âî âðåìÿ æèçíè âåêòîðà, âñòàâëÿþùåãî åäèíñòâåííûé ýëåìåíò â ñâîé êîíåö, ïîñòîÿííà. Âñòàâêà ìíîæåñòâåííûõ ýëåìåíòîâ â âåêòîð ñ åäèíñòâåííûì âûçîâîì âñòàâëÿþùåé ôóíêöèè-÷ëåíà ëèíåéíà îòíîñèòåëüíî ñóììû ÷èñëà ýëåìåíòîâ ïëþñ ðàññòîÿíèå äî êîíöà âåêòîðà. Äðóãèìè ñëîâàìè, íàìíîãî áûñòðåå âñòàâèòü ìíîãî ýëåìåíòîâ â ñåðåäèíó âåêòîðà ñðàçó, ÷åì äåëàòü âñòàâêó ïî îäíîìó ýëåìåíòó. Øàáëîííàÿ âñòàâëÿþùàÿ ôóíêöèÿ-÷ëåí ïðåäðàñïðåäåëÿåò äîñòàòî÷íî ïàìÿòè äëÿ âñòàâêè, åñëè èòåðàòîðû first è last îòíîñÿòñÿ ê ïîñëåäîâàòåëüíîé, äâóíàïðàâëåííîé èëè ïðîèçâîëüíîãî äîñòóïà êàòåãîðèÿì. Èíà÷å ôóíêöèÿ âñòàâëÿåò ýëåìåíòû îäèí çà äðóãèì è íå äîëæíà èñïîëüçîâàòüñÿ äëÿ âñòàâêè â ñåðåäèíó âåêòîðîâ.</p>
     <p>erase (ñòèðàíèå) äåëàåò íåäåéñòâèòåëüíûìè âñå èòåðàòîðû è ññûëêè ïîñëå ïóíêòà ñòèðàíèÿ. Äåñòðóêòîð T âûçûâàåòñÿ ñòîëüêî ðàç, êàêîâî ÷èñëî ñò¸ðòûõ ýëåìåíòîâ, à îïåðàòîð ïðèñâàèâàíèÿ T âûçûâàåòñÿ ñòîëüêî ðàç, êàêîâî ÷èñëî ýëåìåíòîâ â âåêòîðå ïîñëå ñò¸ðòûõ ýëåìåíòîâ.</p>
     <p>×òîáû îïòèìèçèðîâàòü ðàñïðåäåëåíèå ìåñòà, äà¸òñÿ îïðåäåëåíèå äëÿ bool.</p>
     <p><code>class vector‹bool, allocator› {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // áèòîâàÿ ññûëêà (bit reference):</code></p>
     <p><code> class reference {</code></p>
     <p><code> public:</code></p>
     <p><code>  ~reference();</code></p>
     <p><code>  operator bool() const;</code></p>
     <p><code>  reference&amp; operator=(const bool x);</code></p>
     <p><code>  void flip(); // èíâåðòèðóåò áèò (flips the bit)</code></p>
     <p><code> };</code></p>
     <empty-line/>
     <p><code> // îïðåäåëåíèÿ òèïîâ (typedefs):</code></p>
     <p><code> typedef bool const_reference;</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef const_iterator;</code></p>
     <p><code> typedef size_t size_type;</code></p>
     <p><code> typedef ptrdiff_t difference_type;</code></p>
     <p><code> typedef bool value_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_reverse_iterator;</code></p>
     <empty-line/>
     <p><code> // ðàçìåùåíèå/îñâîáîæäåíèå (allocation/deallocation):</code></p>
     <p><code> vector();</code></p>
     <p><code> vector(size_type n, const bool&amp; value = bool());</code></p>
     <p><code> vector(const vector‹bool, allocator›&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> vector(InputIterator first, InputIterator last);</code></p>
     <p><code> ~vector();</code></p>
     <p><code> vector‹bool, allocator›&amp; operator=(const vector‹bool, allocator›&amp; x);</code></p>
     <p><code> void reserve(size_type n);</code></p>
     <p><code> void swap(vector‹bool, allocator›&amp; x);</code></p>
     <empty-line/>
     <p><code> // ñðåäñòâà äîñòóïà (accessors):</code></p>
     <p><code> iterator begin();</code></p>
     <p><code> const_iterator begin() const;</code></p>
     <p><code> iterator end();</code></p>
     <p><code> const_iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin();</code></p>
     <p><code> const_reverse_iterator rbegin();</code></p>
     <p><code> reverse_iterator rend();</code></p>
     <p><code> const_reverse_iterator rend();</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <p><code> size_type capacity() const;</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> reference operator[](size_type n);</code></p>
     <p><code> const_reference operator[](size_type n) const;</code></p>
     <p><code> reference front();</code></p>
     <p><code> const_reference front() const;</code></p>
     <p><code> reference back();</code></p>
     <p><code> const_reference back() const;</code></p>
     <empty-line/>
     <p><code> // âñòàâêà/ñòèðàíèå (insert/irase):</code></p>
     <p><code> void push_back(const bool&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const bool&amp; x = bool());</code></p>
     <p><code> void insert(iterator position, size_type n, const bool&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> void insert(iterator position, InputIterator first, InputIterator last);</code></p>
     <p><code> void pop_back();</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>void swap(vector‹bool, allocator›::reference x, vector‹bool, allocator›::reference y);</code></p>
     <p><code>bool operator==(const vector‹bool, allocator›&amp; x, const vector‹bool, allocator›&amp; y);</code></p>
     <p><code>bool operator‹(const vector‹bool, allocator›&amp; x, const vector‹bool, allocator›&amp; y);</code></p>
     <p>reference - êëàññ, êîòîðûé èìèòèðóåò ïîâåäåíèå ññûëîê îòäåëüíîãî áèòà â vector‹bool›.</p>
     <p>Îæèäàåòñÿ, ÷òî êàæäîå èñïîëíåíèå îáåñïå÷èò îïðåäåëåíèå vector‹bool› äëÿ âñåõ ïîääåðæèâàåìûõ ìîäåëåé ïàìÿòè.</p>
     <cite>
      <p>Ñåé÷àñ íåâîçìîæíî øàáëîíèçèðîâàòü îïðåäåëåíèå. Òî åñòü ìû íå ìîæåì íàïèñàòü: </p>
      <p><code>template ‹template ‹class U› class Allocator = allocator› </code></p>
      <p><code>class vector‹bool, Allocator› {/*… */}; </code></p>
      <p>Ïîýòîìó îáåñïå÷èâàåòñÿ òîëüêî vector‹bool, Allocator›. </p>
     </cite>
    </section>
    <section>
     <title>
      <p>Ñïèñîê (List)</p>
     </title>
     <p>list - âèä ïîñëåäîâàòåëüíîñòè, êîòîðàÿ ïîääåðæèâàåò äâóíàïðàâëåííûå èòåðàòîðû è ïîçâîëÿåò îïåðàöèè âñòàâêè è ñòèðàíèÿ ñ ïîñòîÿííûì âðåìåíåì â ëþáîì ìåñòå ïîñëåäîâàòåëüíîñòè, ñ óïðàâëåíèåì ïàìÿòüþ, îáðàáàòûâàåìûì àâòîìàòè÷åñêè. Â îòëè÷èå îò âåêòîðîâ è äâóñòîðîííèõ î÷åðåäåé, áûñòðûé ïðîèçâîëüíûé äîñòóï ê ýëåìåíòàì ñïèñêà íå ïîääåðæèâàåòñÿ, íî ìíîãèì àëãîðèòìàì, âî âñÿêîì ñëó÷àå, òîëüêî è íóæåí ïîñëåäîâàòåëüíûé äîñòóï.</p>
     <p><code>template ‹class T, template ‹class U› class Allocator = allocator›</code></p>
     <p><code>class list {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // îïðåäåëåíèÿ òèïîâ:</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef const_iterator;</code></p>
     <p><code> typedef Allocator‹T›::pointer pointer;</code></p>
     <p><code> typedef Allocator‹T›::reference reference;</code></p>
     <p><code> typedef Allocator‹T›::const_reference const_reference;</code></p>
     <p><code> typedef size_type;</code></p>
     <p><code> typedef difference_type;</code></p>
     <p><code> typedef Ò value_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_reverse_iterator;</code></p>
     <empty-line/>
     <p><code> // ðàçìåùåíèå/óäàëåíèå:</code></p>
     <p><code> list()</code></p>
     <p><code> list(size_type n, const T&amp; value = T());</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> list(InputIterator first, InputIterator last);</code></p>
     <p><code> list(const list‹T, Allocator›&amp; x);</code></p>
     <p><code> ~list();</code></p>
     <p><code> list‹T, Allocator›&amp; operator=(const list‹T,Allocator›&amp; x);</code></p>
     <p><code> void swap(list‹T, Allocator&amp; x);</code></p>
     <empty-line/>
     <p><code> // ñðåäñòâà äîñòóïà:</code></p>
     <p><code> iterator begin();</code></p>
     <p><code> const_iterator begin() const;</code></p>
     <p><code> iterator end();</code></p>
     <p><code> const_iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin();</code></p>
     <p><code> const_reverse_iterator rbegin();</code></p>
     <p><code> reverse_iterator rend();</code></p>
     <p><code> const_reverse_iterator rend();</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <p><code> reference front();</code></p>
     <p><code> const_reference front() const;</code></p>
     <p><code> reference back();</code></p>
     <p><code> const_reference back() const;</code></p>
     <empty-line/>
     <p><code> // âñòàâêà/ñòèðàíèå:</code></p>
     <p><code> void push_front(const T&amp; x);</code></p>
     <p><code> void push_back(const T&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const T&amp; x = T());</code></p>
     <p><code> void insert(iterator position, size_type n, const T&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> void insert(iterator position, InputIterator first, InputIterator last);</code></p>
     <p><code> void pop_front();</code></p>
     <p><code> void pop_back();</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <empty-line/>
     <p><code> // ñïåöèàëüíûå ìîäèôèöèðóþùèå îïåðàöèè cî ñïèñêîì:</code></p>
     <p><code> void splice(iterator position, list‹T, Allocator›&amp; x);</code></p>
     <p><code> void splice(iterator position, list‹T, Allocator›&amp; x, iterator i);</code></p>
     <p><code> void splice(iterator position, list‹T, Allocator›&amp; x, iterator first, iterator last);</code></p>
     <p><code> void remove(const T&amp; value);</code></p>
     <p><code> template ‹class Predicate› </code></p>
     <p><code> void remove_if(Predicate pred);</code></p>
     <p><code> void unique();</code></p>
     <p><code> template ‹class BinaryPredicate› </code></p>
     <p><code> void unique(BinaryPredicate binary_pred);</code></p>
     <p><code> void merge(list‹T, Allocator›&amp; x);</code></p>
     <p><code> template ‹class Compare›</code></p>
     <p><code> void merge(list‹T,Allocator›&amp; x, Compare comp);</code></p>
     <p><code> void reverse();</code></p>
     <p><code> void sort();</code></p>
     <p><code> template ‹class Compare› void sort(Compare comp);</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Allocator›</code></p>
     <p><code>bool operator==(const list‹T, Allocator›&amp; x, const list‹T, Allocator›&amp; y);</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Allocator›</code></p>
     <p><code>bool operator‹(const list‹T, Allocator›&amp; x, const list‹T, Allocator›&amp; y);</code></p>
     <p>iterator - äâóíàïðàâëåííûé èòåðàòîð, ññûëàþùèéñÿ íà T. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>const_iterator - ïîñòîÿííûé äâóíàïðàâëåííûé èòåðàòîð, ññûëàþùèéñÿ íà const T. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator. Ãàðàíòèðóåòñÿ, ÷òî èìååòñÿ êîíñòðóêòîð äëÿ const_iterator èç iterator.</p>
     <p>size_type - áåççíàêîâûé öåëî÷èñëåííûé òèï. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>difference_type - çíàêîâûé öåëî÷èñëåííûé òèï. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>insert íå âëèÿåò íà äåéñòâèòåëüíîñòü èòåðàòîðîâ è ññûëîê. Âñòàâêà åäèíñòâåííîãî ýëåìåíòà â ñïèñîê çàíèìàåò ïîñòîÿííîå âðåìÿ, è ðîâíî îäèí ðàç âûçûâàåòñÿ êîíñòðóêòîð êîïèðîâàíèÿ T. Âñòàâêà ìíîæåñòâåííûõ ýëåìåíòîâ â ñïèñîê çàâèñèò ëèíåéíî îò ÷èñëà âñòàâëåííûõ ýëåìåíòîâ, à ÷èñëî âûçîâîâ êîíñòðóêòîðà êîïèðîâàíèÿ T òî÷íî ðàâíî ÷èñëó âñòàâëåííûõ ýëåìåíòîâ.</p>
     <p>erase äåëàåò íåäåéñòâèòåëüíûìè òîëüêî èòåðàòîðû è ññûëêè äëÿ ñò¸ðòûõ ýëåìåíòîâ. Ñòèðàíèå åäèíñòâåííîãî ýëåìåíòà - îïåðàöèÿ ïîñòîÿííîãî âðåìåíè ñ åäèíñòâåííûì âûçîâîì äåñòðóêòîðà T. Ñòèðàíèå äèàïàçîíà â ñïèñêå çàíèìàåò ëèíåéíîå âðåìÿ îò ðàçìåðà äèàïàçîíà, à ÷èñëî âûçîâîâ äåñòðóêòîðà òèïà T òî÷íî ðàâíî ðàçìåðó äèàïàçîíà.</p>
     <p>Òàê êàê ñïèñêè ïîçâîëÿþò áûñòðóþ âñòàâêó è ñòèðàíèå â ñåðåäèíå ñïèñêà, òî íåêîòîðûå îïåðàöèè îïðåäåëÿþòñÿ ñïåöèàëüíî äëÿ íèõ:</p>
     <p>list îáåñïå÷èâàåò òðè îïåðàöèè ñòûêîâêè, êîòîðûå ðàçðóøèòåëüíî ïåðåìåùàþò ýëåìåíòû èç îäíîãî ñïèñêà â äðóãîé:</p>
     <p>void splice(iterator position, list‹T, Allocator›&amp; x) âñòàâëÿåò ñîäåðæèìîå x ïåðåä position, è x ñòàíîâèòñÿ ïóñòûì. Òðåáóåòñÿ ïîñòîÿííîå âðåìÿ. Ðåçóëüòàò íå îïðåäåë¸í, åñëè &amp;x==this.</p>
     <p>void splice(iterator position, list‹T, Allocator›&amp; x, iterator i) âñòàâëÿåò ýëåìåíò, óêàçûâàåìûé i, èç ñïèñêà x ïåðåä position è óäàëÿåò ýëåìåíò èç x. Òðåáóåòñÿ ïîñòîÿííîå âðåìÿ. i - äîïóñòèìûé ðàçûìåíîâûâàåìûé èòåðàòîð ñïèñêà x. Ðåçóëüòàò íå èçìåíÿåòñÿ, åñëè position==i èëè position==++i.</p>
     <p>void splice(iterator position, list‹T, Allocator›&amp; x, iterator first, iterator last) âñòàâëÿåò ýëåìåíòû èç äèàïàçîíà [first, last) ïåðåä position è óäàëÿåò ýëåìåíòû èç x. Òðåáóåòñÿ ïîñòîÿííîå âðåìÿ, åñëè &amp;x==this; èíà÷å òðåáóåòñÿ ëèíåéíîå âðåìÿ. [first, last) - äîïóñòèìûé äèàïàçîí â x. Ðåçóëüòàò íå îïðåäåë¸í, åñëè position - èòåðàòîð â äèàïàçîíå [first, last).</p>
     <p>remove ñòèðàåò âñå ýëåìåíòû â ñïèñêå, óêàçàííîì èòåðàòîðîì ñïèñêà i, äëÿ êîòîðîãî âûïîëíÿþòñÿ ñëåäóþùèå óñëîâèÿ: *i==value, pred(*i)==true. remove óñòîé÷èâî, òî åñòü îòíîñèòåëüíûé ïîðÿäîê ýëåìåíòîâ, êîòîðûå íå óäàëåíû, òîò æå ñàìûé, êàê èõ îòíîñèòåëüíûé ïîðÿäîê â ïåðâîíà÷àëüíîì ñïèñêå. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî size() ðàç.</p>
     <p>unique ñòèðàåò âñå, êðîìå ïåðâîãî ýëåìåíòà, èç êàæäîé ïîñëåäîâàòåëüíîé ãðóïïû ðàâíûõ ýëåìåíòîâ â ñïèñêå. Ñîîòâåòñòâóþùèé áèíàðíûé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî size() - 1 ðàç.</p>
     <p>merge ñëèâàåò ñïèñîê àðãóìåíòà ñî ñïèñêîì (ïðåäïîëàãàåòñÿ, ÷òî îáà ñîðòèðîâàíû). Ñëèÿíèå óñòîé÷èâî, òî åñòü äëÿ ðàâíûõ ýëåìåíòîâ â äâóõ ñïèñêàõ ýëåìåíòû ñïèñêà âñåãäà ïðåäøåñòâóþò ýëåìåíòàì èç ñïèñêà àðãóìåíòà. x ïóñò ïîñëå ñëèÿíèÿ. Âûïîëíÿåòñÿ, ñàìîå áîëüøåå, size() + x.size() - 1 ñðàâíåíèé.</p>
     <p>reverse ïåðåñòàâëÿåò ýëåìåíòû â ñïèñêå â îáðàòíîì ïîðÿäêå. Îïåðàöèÿ ëèíåéíîãî âðåìåíè.</p>
     <p>sort ñîðòèðóåò ñïèñîê ñîãëàñíî operator‹ èëè ñðàâíèâàþùåìó ôóíêöèîíàëüíîìó îáúåêòó. Îíà óñòîé÷èâà, òî åñòü îòíîñèòåëüíûé ïîðÿäîê ðàâíûõ ýëåìåíòîâ ñîõðàíÿåòñÿ. Âûïîëíÿåòñÿ ïðèáëèçèòåëüíî NlogN ñðàâíåíèé, ãäå N ðàâíî size().</p>
    </section>
    <section>
     <title>
      <p>Äâóñòîðîííÿÿ î÷åðåäü (Deque)</p>
     </title>
     <p>deque - âèä ïîñëåäîâàòåëüíîñòè, êîòîðàÿ, ïîäîáíî âåêòîðó, ïîääåðæèâàåò èòåðàòîðû ïðîèçâîëüíîãî äîñòóïà. Êðîìå òîãî îíà ïîääåðæèâàåò îïåðàöèè âñòàâêè è ñòèðàíèÿ â íà÷àëå èëè â êîíöå çà ïîñòîÿííîå âðåìÿ; âñòàâêà è ñòèðàíèå â ñåðåäèíå çàíèìàþò ëèíåéíîå âðåìÿ. Êàê ñ âåêòîðàìè, óïðàâëåíèå ïàìÿòüþ îáðàáàòûâàåòñÿ àâòîìàòè÷åñêè.</p>
     <p><code>template ‹class T, template ‹class U› class Allocator = allocator›</code></p>
     <p><code>class deque {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // typedefs:</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef const_iterator;</code></p>
     <p><code> typedef Allocator‹T›::pointer pointer;</code></p>
     <p><code> typedef Allocator‹T›::reference reference;</code></p>
     <p><code> typedef Allocator‹T›::const_reference const_reference;</code></p>
     <p><code> typedef size_type;</code></p>
     <p><code> typedef difference_type;</code></p>
     <p><code> typedef Ò value_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_revcrse_iterator;</code></p>
     <empty-line/>
     <p><code> // ðàçìåùåíèå/óäàëåíèå:</code></p>
     <p><code> deque();</code></p>
     <p><code> deque(size_type n, const T&amp; value = T());</code></p>
     <p><code> deque(const deque‹T, Allocator›&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> deque(InputIterator first, InputIterator last);</code></p>
     <p><code> ~deque();</code></p>
     <p><code> deque‹T, Allocator›&amp; operator=(const deque‹T,Allocator›&amp; x);</code></p>
     <p><code> void swap(deque‹T, Allocator›&amp; x);</code></p>
     <empty-line/>
     <p><code> // ñðåäñòâà äîñòóïà:</code></p>
     <p><code> iterator begin();</code></p>
     <p><code> const_iterator begin() const;</code></p>
     <p><code> iterator end();</code></p>
     <p><code> const_iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin();</code></p>
     <p><code> const_reverse_iterator rbegin();</code></p>
     <p><code> reverse_iterator rend();</code></p>
     <p><code> const_reverse_iterator rend();</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> reference operator[](size_type n);</code></p>
     <p><code> const_reference operator[](size_type n) const;</code></p>
     <p><code> reference front();</code></p>
     <p><code> const_reference front() const;</code></p>
     <p><code> reference back();</code></p>
     <p><code> const_reference back() const;</code></p>
     <empty-line/>
     <p><code> // âñòàâêà/ñòèðàíèå:</code></p>
     <p><code> void push_front(const T&amp; x);</code></p>
     <p><code> void push_back(const T&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const T&amp; x = T());</code></p>
     <p><code> void insert(iterator position, size_type n, const T&amp; x);</code></p>
     <p><code> template</code></p>
     <p><code> void insert(iterator position, InputIterator first, InputIterator last);</code></p>
     <p><code> void pop_front();</code></p>
     <p><code> void pop_back();</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Allocator›</code></p>
     <p><code>bool operator==(const deque‹T, Allocator›&amp; x, const deque‹T, Allocator›&amp; y);</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Allocator›</code></p>
     <p><code>bool operator‹(const deque‹T, Allocator›&amp; x, const deque‹T, Allocator›&amp; y);</code></p>
     <p>iterator - èòåðàòîð ïðîèçâîëüíîãî äîñòóïà, ññûëàþùèéñÿ íà T. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>const_iterator - ïîñòîÿííûé èòåðàòîð ïðîèçâîëüíîãî äîñòóïà, ññûëàþùèéñÿ íà const T. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator. Ãàðàíòèðóåòñÿ, ÷òî èìååòñÿ êîíñòðóêòîð äëÿ const_iterator èç iterator.</p>
     <p>size_type - áåççíàêîâûé öåëî÷èñëåííûé òèï. Òî÷íûé òèï çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>difference_type - çíàêîâûé öåëî÷èñëåííûé òèï. Òî÷íûé çàâèñèò îò èñïîëíåíèÿ è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>insert (âñòàâêà) â ñåðåäèíó äâóñòîðîííåé î÷åðåäè äåëàåò íåäåéñòâèòåëüíûìè âñå èòåðàòîðû è ññûëêè äâóñòîðîííåé î÷åðåäè. insert è push (ïîìåùåíèå) ñ îáîèõ êîíöîâ äâóñòîðîííåé î÷åðåäè äåëàþò íåäåéñòâèòåëüíûìè âñå èòåðàòîðû äâóñòîðîííåé î÷åðåäè, íî íå âëèÿþò íà äåéñòâèòåëüíîñòü âñåõ ññûëîê íà äâóñòîðîííþþ î÷åðåäü. Â õóäøåì ñëó÷àå âñòàâêà åäèíñòâåííîãî ýëåìåíòà â äâóñòîðîííþþ î÷åðåäü çàíèìàåò ëèíåéíîå âðåìÿ îò ìèíèìóìà äâóõ ðàññòîÿíèé: îò òî÷êè âñòàâêè - äî íà÷àëà è äî êîíöà äâóñòîðîííåé î÷åðåäè. Âñòàâêà åäèíñòâåííîãî ýëåìåíòà ëèáî â íà÷àëî, ëèáî â êîíåö äâóñòîðîííåé î÷åðåäè âñåãäà çàíèìàåò ïîñòîÿííîå âðåìÿ è âûçûâàåò åäèíñòâåííûé çàïðîñ êîíñòðóêòîðà êîïèè T. Òî åñòü äâóñòîðîííÿÿ î÷åðåäü îñîáåííî îïòèìèçèðîâàíà äëÿ ïîìåùåíèÿ è èçâëå÷åíèÿ ýëåìåíòîâ â íà÷àëå è â êîíöå.</p>
     <p>erase (ñòèðàíèå) â ñåðåäèíå äâóñòîðîííåé î÷åðåäè äåëàåò íåäåéñòâèòåëüíûìè âñå èòåðàòîðû è ññûëêè äâóñòîðîííåé î÷åðåäè. erase è pop (èçâëå÷åíèå) ñ îáîèõ êîíöîâ äâóñòîðîííåé î÷åðåäè äåëàþò íåäåéñòâèòåëüíûìè òîëüêî èòåðàòîðû è ññûëêè íà ñò¸ðòûé ýëåìåíò. ×èñëî âûçîâîâ äåñòðóêòîðà ðàâíî ÷èñëó ñò¸ðòûõ ýëåìåíòîâ, à ÷èñëî âûçîâîâ îïåðàòîðà ïðèñâàèâàíèÿ ðàâíî ìèíèìóìó èç ÷èñëà ýëåìåíòîâ ïåðåä ñò¸ðòûìè ýëåìåíòàìè è ÷èñëà ýëåìåíòîâ ïîñëå ñò¸ðòûõ ýëåìåíòîâ.</p>
    </section>
   </section>
   <section>
    <title>
     <p>Àññîöèàòèâíûå êîíòåéíåðû (Associative containers)</p>
    </title>
    <section>
     <p>Àññîöèàòèâíûå êîíòåéíåðû îáåñïå÷èâàþò áûñòðûé ïîèñê äàííûõ, îñíîâàííûõ íà êëþ÷àõ. Áèáëèîòåêà ïðåäîñòàâëÿåò ÷åòûðå îñíîâíûõ âèäà àññîöèàòèâíûõ êîíòåéíåðîâ: set (ìíîæåñòâî), multiset (ìíîæåñòâî ñ äóáëèêàòàìè), map (ñëîâàðü) è multimap (ñëîâàðü ñ äóáëèêàòàìè).</p>
     <p>Âñå îíè áåðóò â êà÷åñòâå ïàðàìåòðîâ Key (êëþ÷) è óïîðÿäî÷èâàþùåå îòíîøåíèå Compare, êîòîðîå âûçûâàåò ïîëíîå óïîðÿäî÷åíèå ïî ýëåìåíòàì Key. Êðîìå òîãî, map è multimap àññîöèèðóþò ïðîèçâîëüíûé òèï T ñ Key. Îáúåêò òèïà Compare íàçûâàåòñÿ <emphasis>ñðàâíèâàþùèì îáúåêòîì</emphasis> (<emphasis>comparison object</emphasis>) êîíòåéíåðà.</p>
     <p>Â ýòîì ðàçäåëå, êîãäà ìû ãîâîðèì î ðàâåíñòâå êëþ÷åé, ìû ïîäðàçóìåâàåì îòíîøåíèå ýêâèâàëåíòíîñòè, îáóñëîâëåííîå ñðàâíåíèåì è <emphasis>íå</emphasis> (<emphasis>not</emphasis>) operator== äëÿ êëþ÷åé. Òî åñòü ñ÷èòàåòñÿ, ÷òî äâà êëþ÷à k1 è k2 ÿâëÿþòñÿ ðàâíûìè, åñëè äëÿ ñðàâíèâàþùåãî îáúåêòà comp èñòèííî comp(k1, k2)==false &amp;&amp; comp(k2, k1)==false.</p>
     <p>Àññîöèàòèâíûé êîíòåéíåð ïîääåðæèâàåò <emphasis>óíèêàëüíûå êëþ÷è</emphasis> (<emphasis>unique keys</emphasis>), åñëè îí ìîæåò ñîäåðæàòü, ñàìîå áîëüøåå, îäèí ýëåìåíò äëÿ êàæäîãî çíà÷åíèÿ êëþ÷à. Èíà÷å îí ïîääåðæèâàåò <emphasis>ðàâíûå êëþ÷è</emphasis> (<emphasis>equal keys</emphasis>). set è map ïîääåðæèâàþò óíèêàëüíûå êëþ÷è. multiset è multimap ïîääåðæèâàþò ðàâíûå êëþ÷è.</p>
     <p>Äëÿ set è multiset çíà÷èìûé òèï - òîò æå ñàìûé, ÷òî è òèï êëþ÷à. Äëÿ map è multimap îí ðàâåí pair‹const Key, T›.</p>
     <p>iterator àññîöèàòèâíîãî êîíòåéíåðà îòíîñèòñÿ ê êàòåãîðèè äâóíàïðàâëåííîãî èòåðàòîðà. insert íå âëèÿåò íà äåéñòâèòåëüíîñòü èòåðàòîðîâ è ññûëîê êîíòåéíåðà, à erase äåëàåò íåäåéñòâèòåëüíûìè òîëüêî èòåðàòîðû è ññûëêè íà ñò¸ðòûå ýëåìåíòû.</p>
     <p>Â ñëåäóþùåé òàáëèöå îáîçíà÷àåòñÿ: X - êëàññ àññîöèàòèâíîãî êîíòåéíåðà, a - çíà÷åíèå X, a_uniq - çíà÷åíèå X, êîãäà X ïîääåðæèâàåò óíèêàëüíûå êëþ÷è, a a_eq - çíà÷åíèå X, êîãäà X ïîääåðæèâàåò ìíîãîêðàòíûå êëþ÷è, i è j óäîâëåòâîðÿþò òðåáîâàíèÿì èòåðàòîðîâ ââîäà è óêàçûâàþò íà ýëåìåíòû value_type, [i, j) - äîïóñòèìûé äèàïàçîí, p - äîïóñòèìûé èòåðàòîð äëÿ a, q - ðàçûìåíîâûâàåìûé èòåðàòîð äëÿ a, [q1, q2) - äîïóñòèìûé äèàïàçîí â a, t - çíà÷åíèå X::value_type è k - çíà÷åíèå X::key_type.</p>
     <p><strong>Òàáëèöà 12. Òðåáîâàíèÿ àññîöèàòèâíûõ êîíòåéíåðîâ (â äîïîëíåíèå ê êîíòåéíåðàì)</strong> </p>
     <table>
      <tr align="left">
       <th align="left" valign="top">âûðàæåíèå </th>
       <th align="left" valign="top">âîçâðàùàåìûé òèï </th>
       <th align="left" valign="top">óòâåðæäåíèå/ïðèìå÷àíèå ñîñòîÿíèå äî/ïîñëå </th>
       <th align="left" valign="top">ñëîæíîñòü </th>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X::key_type </td>
       <td align="left" valign="top">Key</td>
       <td align="left" valign="top">-</td>
       <td align="left" valign="top">âðåìÿ êîìïèëÿöèè</td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X::key_compare </td>
       <td align="left" valign="top">Compare </td>
       <td align="left" valign="top">ïî óìîë÷àíèþ less‹key_type›. </td>
       <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X::value_compare </td>
       <td align="left" valign="top">òèï áèíàðíîãî ïðåäèêàòà </td>
       <td align="left" valign="top">òî æå, ÷òî key_compare äëÿ set è multiset; îòíîøåíèå óïîðÿäî÷åíèÿ ïàð, âûçâàííîå ïåðâûì êîìïîíåíòîì (ò.å. Key), äëÿ map è multimap. </td>
       <td align="left" valign="top">âðåìÿ êîìïèëÿöèè </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X(c); <emphasis>X a(c); </emphasis></td>
       <td align="left" valign="top">-</td>
       <td align="left" valign="top">ñîçäàåò ïóñòîé êîíòåéíåð; èñïîëüçóåò ñ êàê îáúåêò ñðàâíåíèÿ. </td>
       <td align="left" valign="top">ïîñòîÿííàÿ </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X(); <emphasis>X a;</emphasis></td>
       <td align="left" valign="top"><emphasis>-</emphasis></td>
       <td align="left" valign="top">ñîçäàåò ïóñòîé êîíòåéíåð; èñïîëüçóåò Compare() êàê îáúåêò ñðàâíåíèÿ. </td>
       <td align="left" valign="top">ïîñòîÿííàÿ </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X(i,j,c); X a(i,j,c);</td>
       <td align="left" valign="top">-</td>
       <td align="left" valign="top">cîçäàåò ïóñòîé êîíòåéíåð è âñòàâëÿåò â íåãî ýëåìåíòû èç äèàïàçîíà [i, j); èñïîëüçóåò ñ êàê îáúåêò ñðàâíåíèÿ. </td>
       <td align="left" valign="top">âîîáùå NlogN (N - ðàññòîÿíèå îò i äî j); ëèíåéíàÿ, åñëè [i, j) îòñîðòèðîâàí value_comp() </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">X(i,j); X a(i,j); </td>
       <td align="left" valign="top">-</td>
       <td align="left" valign="top">òî æå, ÷òî âûøå, íî èñïîëüçóåò Compare() êàê îáúåêò ñðàâíåíèÿ. </td>
       <td align="left" valign="top">òî æå, ÷òî âûøå </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.key_comp() </td>
       <td align="left" valign="top">X::key_compare </td>
       <td align="left" valign="top">âîçâðàùàåò îáúåêò ñðàâíåíèÿ, èç êîòîðîãî à áûë ñîçäàí. </td>
       <td align="left" valign="top">ïîñòîÿííàÿ </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.value_comp() </td>
       <td align="left" valign="top">X::value_compare </td>
       <td align="left" valign="top">âîçâðàùàåò îáúåêò value_compare, ñîçäàííûé èç îáúåêòà ñðàâíåíèÿ. </td>
       <td align="left" valign="top">ïîñòîÿííàÿ</td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a_uniq.insert(t) </td>
       <td align="left" valign="top">pair‹iterator, bool› </td>
       <td align="left" valign="top">âñòàâëÿåò t, åñëè è òîëüêî åñëè â êîíòåéíåðå íåò ýëåìåíòà ñ êëþ÷îì, ðàâíûì êëþ÷ó t. Êîìïîíåíò bool âîçâðàùåííîé ïàðû ïîêàçûâàåò, ïðîèñõîäèò ëè âñòàâêà, à êîìïîíåíò ïàðû iterator óêàçûâàåò íà ýëåìåíò ñ êëþ÷îì, ðàâíûì êëþ÷ó t. </td>
       <td align="left" valign="top">ëîãàðèôìè÷åñêàÿ </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a_eq.insert(t) </td>
       <td align="left" valign="top">iterator </td>
       <td align="left" valign="top">âñòàâëÿåò t è âîçâðàùàåò èòåðàòîð, óêàçûâàþùèé íà âíîâü âñòàâëåííûé ýëåìåíò. </td>
       <td align="left" valign="top">ëîãàðèôìè÷åñêàÿ</td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.insert(p, t) </td>
       <td align="left" valign="top">iterator </td>
       <td align="left" valign="top">âñòàâëÿåò t, åñëè è òîëüêî åñëè â êîíòåéíåðàõ ñ óíèêàëüíûìè êëþ÷àìè íåò ýëåìåíòà ñ êëþ÷îì, ðàâíûì êëþ÷ó t; âñåãäà âñòàâëÿåò t â êîíòåéíåðû ñ äóáëèêàòàìè. âñåãäà âîçâðàùàåò èòåðàòîð, óêàçûâàþùèé íà ýëåìåíò ñ êëþ÷îì, ðàâíûì êëþ÷ó t. èòåðàòîð p - ïîäñêàçêà, óêàçûâàþùàÿ, ãäå âñòàâêà äîëæíà íà÷àòü ïîèñê. </td>
       <td align="left" valign="top">âîîáùå ëîãàðèôìè÷åñêàÿ, íî ñâîäèòñÿ ê ïîñòîÿííîé, åñëè t âñòàâëåí ïðÿìî ïåðåä p. </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.insert(i, j) </td>
       <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
       <td align="left" valign="top">âñòàâëÿåò â êîíòåéíåð ýëåìåíòû èç äèàïàçîíà [i, j); </td>
       <td align="left" valign="top">âîîáùå Nlog(size()+N) (N - ðàññòîÿíèå îò i äî j); ëèíåéíàÿ, åñëè [i, j) îòñîðòèðîâàí ñîãëàñíî value_comp() </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.erase(k) </td>
       <td align="left" valign="top">size_type </td>
       <td align="left" valign="top">ñòèðàåò âñå ýëåìåíòû â êîíòåéíåðå ñ êëþ÷îì, ðàâíûì k. âîçâðàùàåò ÷èñëî óíè÷òîæåííûõ ýëåìåíòîâ. </td>
       <td align="left" valign="top">log(size()) + count(k) </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.erase(q) </td>
       <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
       <td align="left" valign="top">ñòèðàåò ýëåìåíò, óêàçàííûé q. </td>
       <td align="left" valign="top">ñâîäèòñÿ ê ïîñòîÿííîé </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.erase(ql, q2) </td>
       <td align="left" valign="top">ðåçóëüòàò íå èñïîëüçóåòñÿ </td>
       <td align="left" valign="top">ñòèðàåò âñå ýëåìåíòû â äèàïàçîíå [ql, q2). </td>
       <td align="left" valign="top">log(size())+ N, ãäå N - ðàññòîÿíèå îò ql äî q2. </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.find(k) </td>
       <td align="left" valign="top">iterator; const_iterator äëÿ êîíñòàíòû a </td>
       <td align="left" valign="top">âîçâðàùàåò èòåðàòîð, óêàçûâàþùèé íà ýëåìåíò ñ êëþ÷îì, ðàâíûì k, èëè a.end(), åñëè òàêîé ýëåìåíò íå íàéäåí. </td>
       <td align="left" valign="top">ëîãàðèôìè÷åñêàÿ</td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.count(k) </td>
       <td align="left" valign="top">size_type </td>
       <td align="left" valign="top">âîçâðàùàåò ÷èñëî ýëåìåíòîâ ñ êëþ÷îì, ðàâíûì k. </td>
       <td align="left" valign="top">log(size()) + count(k) </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.lower_bound(k) </td>
       <td align="left" valign="top">iterator; const_iterator äëÿ êîíñòàíòû a </td>
       <td align="left" valign="top">âîçâðàùàåò èòåðàòîð, óêàçûâàþùèé íà ïåðâûé ýëåìåíò ñ êëþ÷îì íå ìåíüøå, ÷åì k. </td>
       <td align="left" valign="top">ëîãàðèôìè÷åñêàÿ </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.upper_bound(k) </td>
       <td align="left" valign="top">iterator; const_iterator äëÿ êîíñòàíòû a </td>
       <td align="left" valign="top">âîçâðàùàåò èòåðàòîð, óêàçûâàþùèé íà ïåðâûé ýëåìåíò ñ êëþ÷îì áîëüøå, ÷åì k. </td>
       <td align="left" valign="top">ëîãàðèôìè÷åñêàÿ </td>
      </tr>
      <tr align="left">
       <td align="left" valign="top">a.equal_range(k) </td>
       <td align="left" valign="top">pair‹iterator, itårator›; pair‹const_iterator, const_iterator› äëÿ êîíñòàíòû a </td>
       <td align="left" valign="top">ýêâèâàëåíò make_pair(lower_bound(k), upper_bound(k)). </td>
       <td align="left" valign="top">ëîãàðèôìè÷åñêàÿ </td>
      </tr>
     </table>
     <p>Îñíîâíûì ñâîéñòâîì èòåðàòîðîâ àññîöèàòèâíûõ êîíòåéíåðîâ ÿâëÿåòñÿ òî, ÷òî îíè âûïîëíÿþò èòåðàöèè ÷åðåç êîíòåéíåðû â ïîðÿäêå íåóáûâàíèÿ êëþ÷åé, ãäå íåóáûâàíèå îïðåäåëåíî ñðàâíåíèåì, êîòîðîå èñïîëüçîâàëîñü äëÿ èõ ñîçäàíèÿ. Äëÿ ëþáûõ äâóõ ðàçûìåíîâàííûõ èòåðàòîðîâ i è j òàêèõ, ÷òî ðàññòîÿíèå îò i äî j ÿâëÿåòñÿ ïîëîæèòåëüíûì, value_comp (*j, *i)==false. Äëÿ àññîöèàòèâíûõ êîíòåéíåðîâ ñ óíèêàëüíûìè êëþ÷àìè âûäåðæèâàåòñÿ áîëåå ñèëüíîå óñëîâèå value_comp(*i, *j)==true.</p>
    </section>
    <section>
     <title>
      <p>Ìíîæåñòâî (Set)</p>
     </title>
     <p>set - ýòî àññîöèàòèâíûé êîíòåéíåð, êîòîðûé ïîääåðæèâàåò óíèêàëüíûå êëþ÷è (íå ñîäåðæèò êëþ÷è ñ îäèíàêîâûìè çíà÷åíèÿìè) è îáåñïå÷èâàåò áûñòðûé ïîèñê êëþ÷åé.</p>
     <p><code>template ‹class Key, class Compare = less‹Key›, template ‹class U› class Allocator = allocator›</code></p>
     <p><code>class set {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // typedefs:</code></p>
     <p><code> typedef Key key_type;</code></p>
     <p><code> typedef Key value_type;</code></p>
     <p><code> typedef Allocator‹Key›::pointer pointer;</code></p>
     <p><code> typedef Allocator‹Key›::reference reference;</code></p>
     <p><code> typedef Allocator‹Key›::const_reference const_reference;</code></p>
     <p><code> typedef Compare key_compare;</code></p>
     <p><code> typedef Compare value_compare;</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef iterator const_iterator;</code></p>
     <p><code> typedef size_type;</code></p>
     <p><code> typedef difference_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_reverse_iterator;</code></p>
     <empty-line/>
     <p><code> // allocation/deallocation:</code></p>
     <p><code> set(const Compare&amp; comp = Compare());</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> set(InputIterator first, InputIterator last, const Compare&amp; comp = Compare());</code></p>
     <p><code> set(const set‹Key, Compare, Allocator›&amp; x);</code></p>
     <p><code> ~set();</code></p>
     <p><code> set‹Key, Compare, Allocator›&amp; operator=(const set‹Key, Compare, Allocator›&amp; x);</code></p>
     <p><code> void swap(set‹Key, Compare, Allocator›&amp; x);</code></p>
     <empty-line/>
     <p><code> // accessors:</code></p>
     <p><code> key_compare key_comp() const;</code></p>
     <p><code> value_compare value_comp() const;</code></p>
     <p><code> iterator begin() const;</code></p>
     <p><code> iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin() const;</code></p>
     <p><code> reverse_iterator rend() const;</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <empty-line/>
     <p><code> // insert/erase</code></p>
     <p><code> pair‹iterator, bool› insert(const value_type&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const value_type&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> void insert(InputIterator first, InputIterator last);</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> size_type erase(const key_type&amp; x);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <empty-line/>
     <p><code> // set operations:</code></p>
     <p><code> iterator find(const key_type&amp; x) const;</code></p>
     <p><code> size_type count(const key_type&amp; x) const;</code></p>
     <p><code> iterator lower_bound(const key_type&amp; x) const;</code></p>
     <p><code> iterator upper_bound(const key_type&amp; x) const;</code></p>
     <p><code> pair‹iterator, iterator› equal_range(const key_type&amp; x) const;</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class Compare, class Allocator›</code></p>
     <p><code>bool operator==(const set‹Key, Compare, Allocator›&amp; x, const set‹Key, Compare, Allocator›&amp; y);</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class Compare, class Allocator›</code></p>
     <p><code>bool operator‹(const set‹Key, Compare, Allocator›&amp; x, const set‹Key, Compare, Allocator›&amp; y);</code></p>
     <p>iterator - ïîñòîÿííûé äâóíàïðàâëåííûé èòåðàòîð, óêàçûâàþùèé íà const value_type. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>ñonst_iterator - òîò æå ñàìûé òèï, ÷òî è iterator.</p>
     <p>size_type - öåëî÷èñëåííûé òèï áåç çíàêà. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>difference_type - öåëî÷èñëåííûé òèï ñî çíàêîì. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
    </section>
    <section>
     <title>
      <p>Ìíîæåñòâî ñ äóáëèêàòàìè (Multiset)</p>
     </title>
     <p>multiset - ýòî àññîöèàòèâíûé êîíòåéíåð, êîòîðûé ïîääåðæèâàåò ðàâíûå êëþ÷è (âîçìîæíî, ñîäåðæèò ìíîæåñòâåííûå êîïèè òîãî æå ñàìîãî çíà÷åíèÿ êëþ÷à) è îáåñïå÷èâàåò áûñòðûé ïîèñê êëþ÷åé.</p>
     <p><code>template ‹class Key, class Compare = less‹Key›, template ‹class U› class Allocator = allocator›</code></p>
     <p><code>class multiset {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // typedefs:</code></p>
     <p><code> typedef Key key_type;</code></p>
     <p><code> typedef Key value_type;</code></p>
     <p><code> typedef Allocator‹Key›::pointer pointer;</code></p>
     <p><code> typedef Aliocator‹Key›::reference reference;</code></p>
     <p><code> typedef Allocator‹Key›::const_reference const_reference;</code></p>
     <p><code> typedef Compare key_compare;</code></p>
     <p><code> typedef Compare value_compare;</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef iterator const_iterator;</code></p>
     <p><code> typedef size_type;</code></p>
     <p><code> typedef difference_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_reverse_iterator;</code></p>
     <empty-line/>
     <p><code> // allocation/deallocation:</code></p>
     <p><code> multiset(const Compare&amp; comp = Compare());</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> multiset(InputIterator first, InputIterator last, const Compare&amp; comp = Compare());</code></p>
     <p><code> multiset(const multiset‹Key, Compare, Allocator›&amp; x);</code></p>
     <p><code> ~multiset();</code></p>
     <p><code> multiset‹Key, Compare, Allocator›&amp; operator=(const multiset‹Key, Compare, Allocator›&amp; x);</code></p>
     <p><code> void swap(multiset‹Key, Compare, Allocator›&amp; x);</code></p>
     <empty-line/>
     <p><code> // accessors:</code></p>
     <p><code> key_compare key_comp() const;</code></p>
     <p><code> value_compare value_comp() const;</code></p>
     <p><code> iterator begin() const;</code></p>
     <p><code> iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin();</code></p>
     <p><code> reverse_iterator rend();</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <empty-line/>
     <p><code> // insert/erase:</code></p>
     <p><code> iterator insert(const value_type&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const value_type&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> void insert(InputIterator first, InputIterator last);</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> size_type erase(const key_type&amp; x);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <empty-line/>
     <p><code> // multiset operations:</code></p>
     <p><code> iterator find(const key_type&amp; x) const;</code></p>
     <p><code> size_type count(const key_type&amp; x) const;</code></p>
     <p><code> iterator lower_bound(const key_type&amp; x) const;</code></p>
     <p><code> iterator upper_bound(const key_type&amp; x) const;</code></p>
     <p><code> pair‹iterator, iterator› equal_range(const key_type&amp; x) const;</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class Compare, class Allocator›</code></p>
     <p><code>bool operator==(const multiset‹Key, Compare, Allocator›&amp; x, const multiset‹Key, Compare, Allocator›&amp; y);</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class Compare, class Allocator›</code></p>
     <p><code>bool operator‹(const multiset‹Key, Compare, Allocator›&amp; x, const multiset‹Key, Compare, Allocator›&amp; y);</code></p>
     <p>iterator - ïîñòîÿííûé äâóíàïðàâëåííûé èòåðàòîð, óêàçûâàþùèé íà const value_type. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>ñonst_iterator - òîò æå ñàìûé òèï, ÷òî è iterator.</p>
     <p>size_type - öåëî÷èñëåííûé òèï áåç çíàêà. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>difference_type - öåëî÷èñëåííûé òèï ñî çíàêîì. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
    </section>
    <section>
     <title>
      <p>Ñëîâàðü (Map)</p>
     </title>
     <p>map - àññîöèàòèâíûé êîíòåéíåð, êîòîðûé ïîääåðæèâàåò óíèêàëüíûå êëþ÷è (íå ñîäåðæèò êëþ÷è ñ îäèíàêîâûìè çíà÷åíèÿìè) è îáåñïå÷èâàåò áûñòðûé ïîèñê çíà÷åíèé äðóãîãî òèïà T, ñâÿçàííûõ ñ êëþ÷àìè.</p>
     <p><code>template ‹class Key, class T, class Compare = less‹Key›, template ‹class U› class Allocator = allocator›</code></p>
     <p><code>class map {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // typedefs:</code></p>
     <p><code> typedef Key key_type;</code></p>
     <p><code> typedef pair‹const Key, T› value_type;</code></p>
     <p><code> typedef Compare key_compare;</code></p>
     <p><code> class value_compare : public binary_function‹value_type, value_type, bool› {</code></p>
     <p><code>  friend class map;</code></p>
     <p><code> protected:</code></p>
     <p><code>  Compare comp;</code></p>
     <p><code>  value_compare(Compare c): comp(c) {}</code></p>
     <p><code> public:</code></p>
     <p><code>  bool operator()(const value_type&amp; x, const value_type&amp; y) {</code></p>
     <p><code>   return comp(x.first, y.first);</code></p>
     <p><code>  }</code></p>
     <p><code> };</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef const_iterator;</code></p>
     <p><code> typedef Allocator‹value_type›::pointer pointer;</code></p>
     <p><code> typedef Allocator‹value_type›::reference reference;</code></p>
     <p><code> typedef Allocator‹value_type›::const_reference const_reference;</code></p>
     <p><code> typedef size_type;</code></p>
     <p><code> typedef difference_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_reverse_iterator;</code></p>
     <empty-line/>
     <p><code> // allocation/deallocation:</code></p>
     <p><code> map(const Compare&amp; comp = Compare());</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> map(InputIterator first, InputIterator last, const Compare&amp; comp = Compare());</code></p>
     <p><code> map(const map‹Key, T, Compare, Allocator›&amp; x);</code></p>
     <p><code> ~map();</code></p>
     <p><code> map‹Key, T, Compare, Allocator›&amp; operator=(const map‹Key, T, Compare, Allocator›&amp; x);</code></p>
     <p><code> void swap(map‹Key, T, Compare, Allocator›&amp; x);</code></p>
     <empty-line/>
     <p><code> // accessors:</code></p>
     <p><code> key_compare key_comp() const;</code></p>
     <p><code> value_compare value_comp() const;</code></p>
     <p><code> iterator begin();</code></p>
     <p><code> const_iterator begin() const;</code></p>
     <p><code> iterator end();</code></p>
     <p><code> const_iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin();</code></p>
     <p><code> const_reverse_iterator rbegin();</code></p>
     <p><code> reverse_iterator rend();</code></p>
     <p><code> const_reverse_iterator rend();</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <p><code> Allocator‹T›::reference operator[](const key_type&amp; x);</code></p>
     <empty-line/>
     <p><code> // insert/erase:</code></p>
     <p><code> pair‹iterator, bool› insert(const value_type&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const value_type&amp; x);</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> void insert(InputIterator first, InputIterator last);</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> size_type erase(const key_type&amp; x);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <empty-line/>
     <p><code> // map operations:</code></p>
     <p><code> iterator find(const key_type&amp; x);</code></p>
     <p><code> const_iterator find(const key_type&amp; x) const;</code></p>
     <p><code> size_type count(const key_type&amp; x) const;</code></p>
     <p><code> iterator lower_bound(const key_type&amp; x);</code></p>
     <p><code> const_iterator lower_bound(const key_type&amp; x) const;</code></p>
     <p><code> iterator upper_bound(const key_type&amp; x);</code></p>
     <p><code> const_iterator upper_bound(const key_type&amp; x) const;</code></p>
     <p><code> pair‹iterator, iterator› equal_range(const key_type&amp; x);</code></p>
     <p><code> pair‹const_iterator, const_iterator› equal_range(const key_type&amp; x)const;</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class T, class Compare, class Allocator›</code></p>
     <p><code>bool operator==(const map‹Key, T, Compare, Allocator›&amp; x, const map‹Key, T, Compare, Allocator›&amp; y);</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class T, class Compare, class Allocator›</code></p>
     <p><code>bool operator‹(const map‹Key, T, Compare, Allocator›&amp; x, const map‹Key, T, Compare, Allocator›&amp; y);</code></p>
     <p>iterator - äâóíàïðàâëåííûé èòåðàòîð, óêàçûâàþùèé íà value_type. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>const_iterator - ïîñòîÿííûé äâóíàïðàâëåííûé èòåðàòîð, óêàçûâàþùèé íà const value_type. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator. Ãàðàíòèðóåòñÿ, ÷òî èìååòñÿ êîíñòðóêòîð äëÿ const_iterator èç iterator.</p>
     <p>size_type - öåëî÷èñëåííûé òèï áåç çíàêà. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>difference_type - öåëî÷èñëåííûé òèï ñî çíàêîì. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>Â äîïîëíåíèå ê ñòàíäàðòíîìó íàáîðó ìåòîäîâ àññîöèàòèâíûõ êîíòåéíåðîâ, map îáåñïå÷èâàåò îïåðàöèþ Allocator::reference operator[](const key_type&amp;). Äëÿ ñëîâàðÿ m è êëþ÷à k çàïèñü m[k] ñåìàíòè÷åñêè ýêâèâàëåíòíà (*((m.insert(make_pair(k, T()))).first)).second.</p>
    </section>
    <section>
     <title>
      <p>Ñëîâàðü ñ äóáëèêàòàìè (Multimàð)</p>
     </title>
     <p>multimàð - àññîöèàòèâíûé êîíòåéíåð, êîòîðûé ïîääåðæèâàåò ðàâíûå êëþ÷è (âîçìîæíî, ñîäåðæèò ìíîæåñòâåííûå êîïèè òîãî æå ñàìîãî çíà÷åíèÿ êëþ÷à) è îáåñïå÷èâàåò áûñòðûé ïîèñê çíà÷åíèé äðóãîãî òèïà T, ñâÿçàííûõ ñ êëþ÷àìè.</p>
     <p><code>template ‹class Key, class T, class Compare = less‹Key›, template ‹class U› class Allocator = allocator›</code></p>
     <p><code>class multimap {</code></p>
     <p><code>public:</code></p>
     <empty-line/>
     <p><code> // typedefs:</code></p>
     <p><code> typedef Key key_type;</code></p>
     <p><code> typedef pair‹const Key, T› value_type;</code></p>
     <p><code> typedef Compare key_compare;</code></p>
     <p><code> class value_compare : public binary_function‹value_type, value_type, bool› {</code></p>
     <p><code>  friend class multimap;</code></p>
     <p><code> protected:</code></p>
     <p><code>  Compare comp;</code></p>
     <p><code>  value_compare(Compare c): comp(c) {}</code></p>
     <p><code> public:</code></p>
     <p><code>  bool operator()(const value_type&amp; x, const value_type&amp; y) {</code></p>
     <p><code>   return comp(x.first, y.first);</code></p>
     <p><code>  }</code></p>
     <p><code> };</code></p>
     <p><code> typedef iterator;</code></p>
     <p><code> typedef const_iterator;</code></p>
     <p><code> typedef Allocator‹value_type›::pointer pointer;</code></p>
     <p><code> typedef Allocator‹value_type›::reference reference;</code></p>
     <p><code> typedef Allocator‹value_type›::const_reference const_reference;</code></p>
     <p><code> typedef size_type;</code></p>
     <p><code> typedef difference_type;</code></p>
     <p><code> typedef reverse_iterator;</code></p>
     <p><code> typedef const_reverse_iterator;</code></p>
     <empty-line/>
     <p><code> // allocation/deallocation:</code></p>
     <p><code> multimap(const Compare&amp; comp = Compare());</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> multimap(InputIterator first, InputIterator last, const Compare&amp; comp = Compare());</code></p>
     <p><code> multimap(const multimap‹Key, T, Compare, Allocator›&amp; x);</code></p>
     <p><code> ~multimap();</code></p>
     <p><code> multimap‹Key, T, Compare, Allocator›&amp; operator=(const multimap‹Key, T, Compare, Allocator›&amp; x);</code></p>
     <p><code> void swap(multimap‹Key, T, Compare, Allocator›&amp; x);</code></p>
     <empty-line/>
     <p><code> // accessors:</code></p>
     <p><code> key_compare key_comp() const;</code></p>
     <p><code> value_compare value_comp() const;</code></p>
     <p><code> iterator begin();</code></p>
     <p><code> const_iterator begin() const;</code></p>
     <p><code> iterator end();</code></p>
     <p><code> const_iterator end() const;</code></p>
     <p><code> reverse_iterator rbegin();</code></p>
     <p><code> const_reverse_iterator rbegin();</code></p>
     <p><code> reverse_iterator rend()</code></p>
     <p><code> const_reverse_iterator rend();</code></p>
     <p><code> bool empty() const;</code></p>
     <p><code> size_type size() const;</code></p>
     <p><code> size_type max_size() const;</code></p>
     <empty-line/>
     <p><code> // insert/erase:</code></p>
     <p><code> iterator insert(const value_type&amp; x);</code></p>
     <p><code> iterator insert(iterator position, const value_type&amp; x);</code></p>
     <p><code> template ‹class InputIterator› </code></p>
     <p><code> void insert(InputIterator first, InputIterator last);</code></p>
     <p><code> void erase(iterator position);</code></p>
     <p><code> size_type erase(const key_type&amp; x);</code></p>
     <p><code> void erase(iterator first, iterator last);</code></p>
     <empty-line/>
     <p><code> // multimap operations:</code></p>
     <p><code> iterator find(const key_type&amp; x);</code></p>
     <p><code> const_iterator find(const key_type&amp; x) const;</code></p>
     <p><code> size_type count(const key_type&amp; x) const;</code></p>
     <p><code> iterator lower_bound(const key_type&amp; x);</code></p>
     <p><code> const_iterator lower_bound(const key_type&amp; x) const;</code></p>
     <p><code> iterator upper_bound(const key_type&amp; x);</code></p>
     <p><code> const_iterator upper_bound(const key_type&amp; x) const;</code></p>
     <p><code> pair‹iterator, iterator› equal_range(const key_type&amp; x);</code></p>
     <p><code> pair‹const_iterator, const_iterator› equal_range(const key_type&amp; x) const;</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class T, class Compare, class Allocator›</code></p>
     <p><code>bool operator==(const multimap‹Key, T, Compare, Allocator›&amp; x, const multimap‹Key, T, Compare, Allocator›&amp; y);</code></p>
     <empty-line/>
     <p><code>template ‹class Key, class T, class Compare, class Allocator›</code></p>
     <p><code>bool operator‹(const multimap‹Key, T, Compare, Allocator›&amp; x, const multimap‹Key, T, Compare, Allocator›&amp; y);</code></p>
     <p>iterator - äâóíàïðàâëåííûé èòåðàòîð, óêàçûâàþùèé íà value_type. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>const_iterator - ïîñòîÿííûé äâóíàïðàâëåííûé èòåðàòîð, óêàçûâàþùèé íà value_type. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator. Ãàðàíòèðóåòñÿ, ÷òî èìååòñÿ êîíñòðóêòîð äëÿ const_iterator èç iterator.</p>
     <p>size_type - öåëî÷èñëåííûé òèï áåç çíàêà. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
     <p>difference_type - öåëî÷èñëåííûé òèï ñî çíàêîì. Òî÷íûé òèï çàâèñèò îò ðåàëèçàöèè è îïðåäåëÿåòñÿ â Allocator.</p>
    </section>
   </section>
  </section>
  <section>
   <title>
    <p>ÈÒÅÐÀÒÎÐÛ ÏÎÒÎÊÎÂ</p>
   </title>
   <section>
    <p>×òîáû øàáëîíû àëãîðèòìîâ ìîãëè ðàáîòàòü íåïîñðåäñòâåííî ñ ïîòîêàìè ââîäà-âûâîäà, ïðåäóñìîòðåíû ñîîòâåòñòâóþùèå øàáëîííûå êëàññû, ïîäîáíûå èòåðàòîðàì. Íàïðèìåð,</p>
    <p><code>partial_sum_copy(istream_iterator‹double›(cin), istream_iterator‹double›(), ostream_iterator‹double›(cout, "\n"));</code></p>
    <p>÷èòàåò ôàéë, ñîäåðæàùèé ÷èñëà ñ ïëàâàþùåé çàïÿòîé, èç cin è ïå÷àòàåò ÷àñòè÷íûå ñóììû â cout.</p>
   </section>
   <section>
    <title>
     <p>Èòåðàòîð âõîäíîãî ïîòîêà (Istream Iterator)</p>
    </title>
    <p>istream_iterator‹T› ÷èòàåò (èñïîëüçóÿ operator››) ïîñëåäîâàòåëüíûå ýëåìåíòû èç âõîäíîãî ïîòîêà, äëÿ êîòîðîãî îí áûë ñîçäàí. Ïîñëå ñâîåãî ñîçäàíèÿ èòåðàòîð êàæäûé ðàç ïðè èñïîëüçîâàíèè ++ ÷èòàåò è ñîõðàíÿåò çíà÷åíèå T. Åñëè äîñòèãíóò êîíåö ïîòîêà (operator void* () â ïîòîêå âîçâðàùàåò false), èòåðàòîð ñòàíîâèòñÿ ðàâíûì çíà÷åíèþ <emphasis>end-of-stream</emphasis> (<emphasis>êîíåö-ïîòîêà</emphasis>). Êîíñòðóêòîð áåç ïàðàìåòðîâ istream_iterator() âñåãäà ñîçäà¸ò èòåðàòîðíûé îáúåêò êîíöà ïîòîêîâîãî ââîäà, ÿâëÿþùèéñÿ åäèíñòâåíûì çàêîííûì èòåðàòîðîì, êîòîðûé ñëåäóåò èñïîëüçîâàòü äëÿ êîíå÷íîãî óñëîâèÿ. Ðåçóëüòàò operator* äëÿ êîíöà ïîòîêà íå îïðåäåë¸í, à äëÿ ëþáîãî äðóãîãî çíà÷åíèÿ èòåðàòîðà âîçâðàùàåòñÿ const T&amp;.</p>
    <p>Íåâîçìîæíî çàïèñûâàòü ÷òî-ëèáî ñ èñïîëüçîâàíèåì âõîäíûõ èòåðàòîðîâ. Îñíîâíàÿ îñîáåííîñòü âõîäíûõ èòåðàòîðîâ - òîò ôàêò, ÷òî îïåðàòîðû ++ íå ñîõðàíÿþò ðàâåíñòâà, òî åñòü i==j íå ãàðàíòèðóåò âîîáùå, ÷òî ++i==++j. Êàæäûé ðàç, êîãäà ++ èñïîëüçóåòñÿ, ÷èòàåòñÿ íîâîå çíà÷åíèå. Ïðàêòè÷åñêîå ñëåäñòâèå ýòîãî ôàêòà - òî, ÷òî âõîäíûå èòåðàòîðû ìîãóò èñïîëüçîâàòüñÿ òîëüêî äëÿ îäíîïðîõîäíûõ àëãîðèòìîâ, ÷òî äåéñòâèòåëüíî èìååò çäðàâûé ñìûñë, òàê êàê ìíîãîïðîõîäíûì àëãîðèòìàì âñåãäà áîëåå ñîîòâåòñòâóåò èñïîëüçîâàíèå ñòðóêòóð äàííûõ â îïåðàòèâíîé ïàìÿòè.</p>
    <p>Äâà èòåðàòîðà <emphasis>êîíåö-ïîòîêà</emphasis> âñåãäà ðàâíû. Èòåðàòîð <emphasis>êîíåö-ïîòîêà</emphasis> íå ðàâåí <emphasis>íå-êîíåö-ïîòîêà</emphasis> èòåðàòîðó. Äâà <emphasis>íå-êîíåö-ïîòîêà</emphasis> èòåðàòîðà ðàâíû, êîãäà îíè ñîçäàíû èç òîãî æå ñàìîãî ïîòîêà.</p>
    <p><code>template ‹class T, class Distance = ptrdiff_t›</code></p>
    <p><code>class istream_iterator: public input_iterator‹T, Distance› {</code></p>
    <p><code> friend bool operator==(const istream_iterator‹T, Distance›&amp; x, const istream_iterator‹T, Distance›&amp; y);</code></p>
    <p><code>public:</code></p>
    <p><code> istream_iterator();</code></p>
    <p><code> istream_iterator(istream&amp; s);</code></p>
    <p><code> istream_iterator(const istream_iterator‹T, Distance›&amp; x);</code></p>
    <p><code> ~istream_iterator();</code></p>
    <p><code> const T&amp; operator*() const;</code></p>
    <p><code> istream_iterator‹T, Distance›&amp; operator++();</code></p>
    <p><code> istream_iterator‹T, Distance› operator++(int);</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>template ‹class T, class Distance›</code></p>
    <p><code>bool operator==(const istream_iterator‹T, Distance›&amp; x, const istream_iterator‹T, Distance›&amp; y);</code></p>
   </section>
   <section>
    <title>
     <p>Èòåðàòîð âûõîäíîãî ïîòîêà (Ostream Iterator)</p>
    </title>
    <p>istream_iterator‹T› çàïèñûâàåò (èñïîëüçóÿ operator‹‹) ïîñëåäîâàòåëüíûå ýëåìåíòû â âûõîäíîé ïîòîê, èç êîòîðîãî îí áûë ñîçäàí. Åñëè îí áûë ñîçäàí ñ ïàðàìåòðîì êîíñòðóêòîðà char*, ýòà ñòðîêà, íàçûâàåìàÿ <emphasis>ñòðîêîé ðàçäåëèòåëÿ</emphasis> (<emphasis>delimiter string</emphasis>), çàïèñûâàåòñÿ â ïîòîê ïîñëå òîãî, êàê çàïèñûâàåòñÿ êàæäîå T. Íåâîçìîæíî ñ ïîìîùüþ âûõîäíîãî èòåðàòîðà ïîëó÷èòü çíà÷åíèå. Åãî åäèíñòâåííîå èñïîëüçîâàíèå - âûõîäíîé èòåðàòîð â ñèòóàöèÿõ, ïîäîáíûõ íèæåñëåäóþùåìó:</p>
    <p><code>while (first != last) *result++ = *first++;</code></p>
    <p>ostream_iterator îïðåäåë¸í êàê:</p>
    <p><code>template ‹class T›</code></p>
    <p><code>class ostream_iterator: public output_iterator {</code></p>
    <p><code>public:</code></p>
    <p><code> ostream_iterator(ostream&amp; s);</code></p>
    <p><code> ostream_iterator(ostream&amp; s, const char* delimiter);</code></p>
    <p><code> ostream_iterator(const ostream_iterator‹T›&amp; x);</code></p>
    <p><code> ~ostream_iterator();</code></p>
    <p><code> ostream_iterator‹T›&amp; operator=(const T&amp; value);</code></p>
    <p><code> ostream_iterator‹T›&amp; operator*();</code></p>
    <p><code> ostream_iterator‹T›&amp; operator++();</code></p>
    <p><code> ostream_iterator‹T›&amp; operator++(int);</code></p>
    <p><code>};</code></p>
   </section>
  </section>
  <section>
   <title>
    <p>ÀËÃÎÐÈÒÌÛ</p>
   </title>
   <section>
    <p>Âñå àëãîðèòìû îòäåëåíû îò äåòàëåé ðåàëèçàöèè ñòðóêòóð äàííûõ è èñïîëüçóþò â êà÷åñòâå ïàðàìåòðîâ òèïû èòåðàòîðîâ. Ïîýòîìó îíè ìîãóò ðàáîòàòü ñ îïðåäåëÿåìûìè ïîëüçîâàòåëåì ñòðóêòóðàìè äàííûõ, êîãäà ýòè ñòðóêòóðû äàííûõ èìåþò òèïû èòåðàòîðîâ, óäîâëåòâîðÿþùèå ïðåäïîëîæåíèÿì â àëãîðèòìàõ.</p>
    <p>Äëÿ íåêîòîðûõ àëãîðèòìîâ ïðåäóñìîòðåíû è îïåðàòèâíûå è êîïèðóþùèå âåðñèè. Ðåøåíèå, âêëþ÷àòü ëè êîïèðóþùóþ âåðñèþ, áûëî îáû÷íî îñíîâàíî íà ðàññìîòðåíèè ñëîæíîñòè. Êîãäà ñòîèìîñòü âûïîëíåíèÿ îïåðàöèè äîìèíèðóåò íàä ñòîèìîñòüþ êîïèè, êîïèðóþùàÿ âåðñèÿ íå âêëþ÷åíà. Íàïðèìåð, sort_copy íå âêëþ÷åíà, òàê êàê ñòîèìîñòü ñîðòèðîâêè íàìíîãî çíà÷èòåëüíåå, è ïîëüçîâàòåëè ìîãëè áû òàêæå äåëàòü copy ïåðåä sort. Êîãäà òàêàÿ âåðñèÿ ïðåäóñìîòðåíà äëÿ êàêîãî-òî àëãîðèòìà <emphasis>algorithm</emphasis>, îí íàçûâàåòñÿ <emphasis>algorithm _copy </emphasis>. Àëãîðèòìû, êîòîðûå áåðóò ïðåäèêàòû, îêàí÷èâàþòñÿ ñóôôèêñîì _if (êîòîðûé ñëåäóåò çà ñóôôèêñîì _copy).</p>
    <p>Êëàññ Predicate èñïîëüçóåòñÿ âñÿêèé ðàç, êîãäà àëãîðèòì îæèäàåò ôóíêöèîíàëüíûé îáúåêò, ïðè ïðèìåíåíèè êîòîðîãî ê ðåçóëüòàòó ðàçûìåíîâàíèÿ ñîîòâåòñòâóþùåãî èòåðàòîðà âîçâðàùàåòñÿ çíà÷åíèå, îáðàòèìîå â bool. Äðóãèìè ñëîâàìè, åñëè àëãîðèòì áåð¸ò Predicate pred êàê ñâîé ïàðàìåòð è first êàê ñâîé ïàðàìåòð èòåðàòîðà, îí äîëæåí ðàáîòàòü ïðàâèëüíî â êîíñòðóêöèè if (pred(*first)) {…}. Ïðåäïîëàãàåòñÿ, ÷òî ôóíêöèîíàëüíûé îáúåêò pred íå ïðèìåíÿåò êàêóþ-ëèáî íåïîñòîÿííóþ ôóíêöèþ äëÿ ðàçûìåíîâàííîãî èòåðàòîðà.</p>
    <p>Êëàññ BinaryPredicate èñïîëüçóåòñÿ âñÿêèé ðàç, êîãäà àëãîðèòì îæèäàåò ôóíêöèîíàëüíûé îáúåêò, êîòîðûé ïðè åãî ïðèìåíåíèè ê ðåçóëüòàòó ðàçûìåíîâàíèÿ äâóõ ñîîòâåòñòâóþùèõ èòåðàòîðîâ èëè ê ðàçûìåíîâàíèþ èòåðàòîðà è òèïà T, êîãäà T - ÷àñòü ñèãíàòóðû, âîçâðàùàåò çíà÷åíèå, îáðàòèìîå â bool. Äðóãèìè ñëîâàìè, åñëè àëãîðèòì áåð¸ò BinaryPredicate binary_pred êàê ñâîé ïàðàìåòð è first1 è first2 êàê ñâîè ïàðàìåòðû èòåðàòîðîâ, îí äîëæåí ðàáîòàòü ïðàâèëüíî â êîíñòðóêöèè if (binary_pred(*first, *first2)) {…}. BinaryPredicate âñåãäà áåð¸ò òèï ïåðâîãî èòåðàòîðà êàê ñâîé ïåðâûé ïàðàìåòð, òî åñòü â òåõ ñëó÷àÿõ, êîãäà T value - ÷àñòü ñèãíàòóðû, îí äîëæåí ðàáîòàòü ïðàâèëüíî â êîíòåêñòå if (binary_pred (*first, value)) {…}. Îæèäàåòñÿ, ÷òî binary_pred íå áóäåò ïðèìåíÿòü êàêóþ-ëèáî íåïîñòîÿííóþ ôóíêöèþ äëÿ ðàçûìåíîâàííûõ èòåðàòîðîâ.</p>
    <p>Â îïèñàíèè àëãîðèòìîâ îïåðàòîðû + è - èñïîëüçóþòñÿ äëÿ íåêîòîðûõ êàòåãîðèé èòåðàòîðîâ, äëÿ êîòîðûõ îíè íå äîëæíû áûòü îïðåäåëåíû. Â ýòèõ ñëó÷àÿõ ñåìàíòèêà a+n òàêàÿ æå, êàê ñåìàíòèêà {X tmp = a; advance(tmp, n); return tmp;}, à ñåìàíòèêà a-b òàêàÿ æå, êàê ñåìàíòèêà {Distance n; distance(a, b, n); return n;}.</p>
   </section>
   <section>
    <title>
     <p>Íå ìåíÿþùèå ïîñëåäîâàòåëüíîñòü îïåðàöèè (Non-mutating sequence operations)</p>
    </title>
    <section>
     <title>
      <p>Îïåðàöèè ñ êàæäûì ýëåìåíòîì (For each)</p>
     </title>
     <p><code>template &lt;class InputIterator, class Function&gt; </code></p>
     <p><code>Function for_each(InputIterator first, InputIterator last, Function f);</code></p>
     <p>for_each ïðèìåíÿåò f ê ðåçóëüòàòó ðàçûìåíîâàíèÿ êàæäîãî èòåðàòîðà â äèàïàçîíå [first, last) è âîçâðàùàåò f. Ïðèíÿòî, ÷òî f íå ïðèìåíÿåò êàêóþ-òî íåïîñòîÿííóþ ôóíêöèþ ê ðàçûìåíîâàííîìó èòåðàòîðó. f ïðèìåíÿåòñÿ òî÷íî last-first ðàç. Åñëè f âîçâðàùàåò ðåçóëüòàò, ðåçóëüòàò èãíîðèðóåòñÿ.</p>
    </section>
    <section>
     <title>
      <p>Íàéòè (Find)</p>
     </title>
     <p><code>template ‹class InputIterator, class T›</code></p>
     <p><code>InputIterator find(InputIterator first, InputIterator last, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class Predicate›</code></p>
     <p><code>InputIterator find_if(InputIterator first, InputIterator last, Predicate pred);</code></p>
     <p>find âîçâðàùàåò ïåðâûé èòåðàòîð i â äèàïàçîíå [first, last), äëÿ êîòîðîãî ñîáëþäàþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==value, pred(*i)==true. Åñëè òàêîé èòåðàòîð íå íàéäåí, âîçâðàùàåòñÿ last. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî find(first, last, value) - first ðàç.</p>
    </section>
    <section>
     <title>
      <p>Íàéòè ðÿäîì (Àdjacent find)</p>
     </title>
     <p><code>template ‹class ForwardIterator›</code></p>
     <p><code>ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class BinaryPredicate›</code></p>
     <p><code>ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred);</code></p>
     <p>adjacent_find âîçâðàùàåò ïåðâûé èòåðàòîð i òàêîé, ÷òî i è i+1 íàõîäÿòñÿ â äèàïàçîíå [first, last) è äëÿ êîòîðîãî ñîáëþäàþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==*(i+1), binary_pred(*i, *(i+1))==true. Åñëè òàêîé èòåðàòîð i íå íàéäåí, âîçâðàùàåòñÿ last. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ, ñàìîå áîëüøåå, max((last - first) - 1, 0) ðàç.</p>
    </section>
    <section>
     <title>
      <p>Ïîäñ÷åò (Count)</p>
     </title>
     <p><code>template ‹class InputIterator, class T, class Size›</code></p>
     <p><code>void count(InputIterator first, InputIterator last, const T&amp; value, Size&amp; n);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class Predicate, class Size›</code></p>
     <p><code>void count_if(InputIterator first, InputIterator last, Predicate pred, Size&amp; n);</code></p>
     <p>count äîáàâëÿåò ê n ÷èñëî èòåðàòîðîâ i â äèàïàçîíå [first, last), äëÿ êîòîðûõ ñîáëþäàþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==value, pred(*i)==true. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî last-first ðàç.</p>
     <p>count äîëæåí ñîõðàíÿòü ðåçóëüòàò â ïàðàìåòðå ññûëêè âìåñòî òîãî, ÷òîáû âîçâðàùàòü åãî, ïîòîìó ÷òî òèï ðàçìåðà íå ìîæåò áûòü âûâåäåí èç âñòðîåííûõ òèïîâ èòåðàòîðîâ, êàê, íàïðèìåð, int*.</p>
    </section>
    <section>
     <title>
      <p>Îòëè÷èå (Mismatch)</p>
     </title>
     <p><code>template ‹class InputIterator1, class InputIterator2›</code></p>
     <p><code>pair‹InputIterator1, InputIterator2› mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class BinaryPredicate›</code></p>
     <p><code>pair‹InputIterator1, InputIterator2› mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred);</code></p>
     <p>mismatch âîçâðàùàåò ïàðó èòåðàòîðîâ i è j òàêèõ, ÷òî j==first2 + (i - first1) è i ÿâëÿåòñÿ ïåðâûì èòåðàòîðîì â äèàïàçîíå [first1, last1), äëÿ êîòîðîãî ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ âûïîëíåíû: !(*i==*(first2 + (i - first1))), binary_pred (*i, *(first2 + (i - first1)))==false. Åñëè òàêîé èòåðàòîð i íå íàéäåí, ïàðà last1 è first2 + (last1 - first1) âîçâðàùàåòñÿ. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ, ñàìîå áîëüøåå, last1 - first1 ðàç.</p>
    </section>
    <section>
     <title>
      <p>Ñðàâíåíèå íà ðàâåíñòâî (Equal)</p>
     </title>
     <p><code>template ‹class InputIterator1, class InputIterator2›</code></p>
     <p><code>bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class BinaryPredicate›</code></p>
     <p><code>bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred);</code></p>
     <p>equal âîçâðàùàåò true, åñëè äëÿ êàæäîãî èòåðàòîðà i â äèàïàçîíå [first1, last1) âûïîëíåíû ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==*(first2 + (i-first1)), binary_pred(*i, *(first2 + (i - first1)))==true. Èíà÷å equal âîçâðàùàåò false. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ, ñàìîå áîëüøåå, last1 - first1 ðàç.</p>
    </section>
    <section>
     <title>
      <p>Ïîèñê ïîäïîñëåäîâàòåëüíîñòè (Search)</p>
     </title>
     <p><code>template ‹class ForwardIterator1, class ForwardIterator2›</code></p>
     <p><code>ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator1, class ForwardIterator2, class BinaryPredicate›</code></p>
     <p><code>ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred);</code></p>
     <p>search íàõîäèò ïîäïîñëåäîâàòåëüíîñòü ðàâíûõ çíà÷åíèé â ïîñëåäîâàòåëüíîñòè. search âîçâðàùàåò ïåðâûé èòåðàòîð i â äèàïàçîíå [first1, last1 - (last2 - first2)) òàêîé, ÷òî äëÿ ëþáîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëà n, ìåíüøåãî ÷åì last2 - first2, âûïîëíåíû ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *(i+n)==*(first2+n), binary_pred(*(i+n), *(first2+n))==true. Åñëè òàêîé èòåðàòîð íå íàéäåí, âîçâðàùàåòñÿ last1. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ, ñàìîå áîëüøåå, (last1 - first1) * (last2 - first2) ðàç. Êâàäðàòè÷íîå ïîâåäåíèå, îäíàêî, ÿâëÿåòñÿ êðàéíå ìàëîâåðîÿòíûì.</p>
    </section>
   </section>
   <section>
    <title>
     <p>Ìåíÿþùèå ïîñëåäîâàòåëüíîñòü îïåðàöèè (Mutating sequence operations)</p>
    </title>
    <section>
     <title>
      <p>Êîïèðîâàòü (Copy)</p>
     </title>
     <p><code>template ‹class InputIterator, class OutputIterator›</code></p>
     <p><code>OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);</code></p>
     <p>copy êîïèðóåò ýëåìåíòû. Äëÿ êàæäîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëà n ‹ (last - first) âûïîëíÿåòñÿ ïðèñâàèâàíèå *(result + n) = *(first + n). Òî÷íî äåëàåòñÿ last - first ïðèñâàèâàíèé. Ðåçóëüòàò copy íå îïðåäåë¸í, åñëè result íàõîäèòñÿ â äèàïàçîíå [first, last).</p>
     <p><code>template ‹class BidirectionalIterator1, class BidirectionalIterator2›</code></p>
     <p><code>BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result);</code></p>
     <p>copy_backward êîïèðóåò ýëåìåíòû â äèàïàçîíå [first, last) â äèàïàçîí [result - (last - first), result), íà÷èíàÿ îò last-1 è ïðîäîëæàÿ äî first. Åãî íóæíî èñïîëüçîâàòü âìåñòî copy, êîãäà last íàõîäèòñÿ â äèàïàçîíå [result - (last-first), result). Äëÿ êàæäîãî ïîëîæèòåëüíîãî öåëîãî ÷èñëà n ‹= (last - first) âûïîëíÿåòñÿ ïðèñâàèâàíèå *(result-n) = *(last-n). copy_backward âîçâðàùàåò result - (last-first). Òî÷íî äåëàåòñÿ last - first ïðèñâàèâàíèé. Ðåçóëüòàò copy_backward íå îïðåäåë¸í, åñëè result íàõîäèòñÿ â äèàïàçîíå [first, last).</p>
    </section>
    <section>
     <title>
      <p>Îáìåíÿòü (Swap)</p>
     </title>
     <p><code>template ‹class T›</code></p>
     <p><code>void swap(T&amp; a, T&amp; b);</code></p>
     <p>swap îáìåíèâàåò çíà÷åíèÿ, õðàíèìûå â äâóõ ìåñòàõ.</p>
     <p><code>template ‹class ForwardIterator1, class ForwardIterator2›</code></p>
     <p><code>void iter_swap(ForwardIterator1 a, ForwardIterator2 b);</code></p>
     <p>iter_swap îáìåíèâàåò çíà÷åíèÿ, óêàçàííûå äâóìÿ èòåðàòîðàìè a è b.</p>
     <p><code>tempate ‹class ForwardIterator1, class ForwardIterator2›</code></p>
     <p><code>ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);</code></p>
     <p>Äëÿ êàæäîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëà n ‹ (last1 - first1) âûïîëíÿåòñÿ ïåðåñòàíîâêà: swap(*(first1 + n), *(first2 + n)). swap_ranges âîçâðàùàåò first2 + (last1 - first1). Âûïîëíÿåòñÿ òî÷íî last1 - first1 ïåðåñòàíîâîê. Ðåçóëüòàò swap_ranges íå îïðåäåë¸í, åñëè äâà äèàïàçîíà [first1, last1) è [first2, first2 + (last1 - first1)) ïåðåêðûâàþòñÿ.</p>
    </section>
    <section>
     <title>
      <p>Ïðåîáðàçîâàòü (Transform)</p>
     </title>
     <p><code>template ‹class InputIterator, class OutputIterator, class UnaryOperation›</code></p>
     <p><code>OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator, class Binary0peration›</code></p>
     <p><code>OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation binary_op);</code></p>
     <p>transform ïðèñâàèâàåò ïîñðåäñòâîì êàæäîãî èòåðàòîðà i â äèàïàçîíå [result, result+(last1-first1)) íîâîå ñîîòâåòñòâóþùåå çíà÷åíèå, ðàâíîå op(*(first1+(i-result)) èëè binary_op(*(first1+(i-result), *(first2+(i-result))). transform âîçâðàùàåò result+(last1-first1). Ïðèìåíÿþòñÿ op èëè binary_op òî÷íî last1 - first1 ðàç. Îæèäàåòñÿ, ÷òî op è binary_op íå èìåþò êàêèõ-ëèáî ïîáî÷íûõ ýôôåêòîâ. result ìîæåò áûòü ðàâåí first â ñëó÷àå óíàðíîãî ïðåîáðàçîâàíèÿ èëè first1 ëèáî first2 â ñëó÷àå áèíàðíîãî.</p>
    </section>
    <section>
     <title>
      <p>Çàìåíèòü (Replace)</p>
     </title>
     <p><code>template ‹class ForwardIterator, class T›</code></p>
     <p><code>void replace(ForwardIterator first, ForwardIterator last, const T&amp; old_value, const T&amp; new_value);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class Predicate, class T›</code></p>
     <p><code>void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T&amp; new_value);</code></p>
     <p>replace çàìåíÿåò ýëåìåíòû, óêàçàííûå èòåðàòîðîì i â äèàïàçîíå [first, last), çíà÷åíèåì new_value, êîãäà âûïîëíÿþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==old_value, pred(*i)==true. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî last - first ðàç.</p>
     <p><code>template ‹class InputIterator, class OutputIterator, class T›</code></p>
     <p><code>OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T&amp; old_value, const T&amp; new_value);</code></p>
     <empty-line/>
     <p><code>template ‹class Iterator, class OutputIterator, class Predicate, class T›</code></p>
     <p><code>OutputIterator replace_copy_if(Iterator first, Iterator last, OutputIterator result, Predicate pred, const T&amp; new_value);</code></p>
     <p>replace_copy ïðèñâàèâàåò êàæäîìó èòåðàòîðó i â äèàïàçîíå [result, result+(last-first)) çíà÷åíèå new_value èëè *(first+(i-result)) â çàâèñèìîñòè îò âûïîëíåíèÿ ñëåäóþùèõ ñîîòâåòñòâóþùèõ óñëîâèé: *(first+(i-result))==old_value, pred(*(first+(i-result)))==true. replace_copy âîçâðàùàåò result+(last-first). Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî last - first ðàç.</p>
    </section>
    <section>
     <title>
      <p>Çàïîëíèòü (Fill)</p>
     </title>
     <p><code>template ‹class ForwardIterator, class T›</code></p>
     <p><code>void fill(ForwardIterator first, ForwardIterator last, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class OutputIterator, class Size, class T›</code></p>
     <p><code>OutputIterator fill_n(Output Iterator first, Size n, const T&amp; value);</code></p>
     <p>fill ïðèñâàèâàåò çíà÷åíèÿ ÷åðåç âñå èòåðàòîðû â äèàïàçîíå [first, last) èëè [first, first+n). fill_n âîçâðàùàåò first+n. Òî÷íî äåëàåòñÿ last - first (èëè n) ïðèñâàèâàíèé.</p>
    </section>
    <section>
     <title>
      <p>Ïîðîäèòü (Generate)</p>
     </title>
     <p><code>template ‹class ForwardIterator, class Generator›</code></p>
     <p><code>void generate(ForwardIterator first, ForwardIterator last, Generator gen);</code></p>
     <empty-line/>
     <p><code>template ‹class OutputIterator, class Size, class Generator›</code></p>
     <p><code>OutputIterator generate_n(OutputIterator first, Size n, Generator gen);</code></p>
     <p>generate âûçûâàåò ôóíêöèîíàëüíûé îáúåêò gen è ïðèñâàèâàåò âîçâðàùàåìîå gen çíà÷åíèå ÷åðåç âñå èòåðàòîðû â äèàïàçîíå [first, last) èëè [first, first + n). gen íå áåð¸ò íèêàêèå ïàðàìåòðû. generate_n âîçâðàùàåò first + n. Òî÷íî âûïîëíÿåòñÿ last - first (èëè n) âûçîâîâ gen è ïðèñâàèâàíèé.</p>
    </section>
    <section>
     <title>
      <p>Óäàëèòü (Remove)</p>
     </title>
     <p><code>template ‹class ForwardIterator, class T›</code></p>
     <p><code>ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class Predicate›</code></p>
     <p><code>ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);</code></p>
     <p>remove óñòðàíÿåò âñå ýëåìåíòû, óêàçûâàåìûå èòåðàòîðîì i â äèàïàçîíå [first, last), äëÿ êîòîðûõ âûïîëíåíû ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==value, pred(*i)==true. remove âîçâðàùàåò êîíåö âîçíèêàþùåãî â ðåçóëüòàòå ñâîåé ðàáîòû äèàïàçîíà. remove óñòîé÷èâ, òî åñòü îòíîñèòåëüíûé ïîðÿäîê ýëåìåíòîâ, êîòîðûå íå óäàëåíû, òàêîé æå, êàê èõ îòíîñèòåëüíûé ïîðÿäîê â ïåðâîíà÷àëüíîì äèàïàçîíå. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî last -first ðàç.</p>
     <p><code>template ‹class InputIterator, class OutputIterator, class T›</code></p>
     <p><code>OutputIterator remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class OutputIterator, class Predicate›</code></p>
     <p><code>OutputIterator remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);</code></p>
     <p>remove_copy êîïèðóåò âñå ýëåìåíòû, óêàçûâàåìûå èòåðàòîðîì i â äèàïàçîíå [first, last), äëÿ êîòîðûõ íå âûïîëíåíû ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==value, pred(*i)==true. remove_copy âîçâðàùàåò êîíåö âîçíèêàþùåãî â ðåçóëüòàòå ñâîåé ðàáîòû äèàïàçîíà. remove_copy óñòîé÷èâ, òî åñòü îòíîñèòåëüíûé ïîðÿäîê ýëåìåíòîâ â ðåçóëüòèðóþùåì äèàïàçîíå òàêîé æå, êàê èõ îòíîñèòåëüíûé ïîðÿäîê â ïåðâîíà÷àëüíîì äèàïàçîíå. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî last-first ðàç.</p>
    </section>
    <section>
     <title>
      <p>Óáðàòü ïîâòîðû (Unique)</p>
     </title>
     <p><code>template ‹class ForwardIterator›</code></p>
     <p><code>ForwardIterator unique(ForwardIterator first, ForwardIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class BinaryPredicate›</code></p>
     <p><code>ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred);</code></p>
     <p>unique óñòðàíÿåò âñå, êðîìå ïåðâîãî, ýëåìåíòû èç êàæäîé ïîñëåäîâàòåëüíîé ãðóïïû ðàâíûõ ýëåìåíòîâ, óêàçûâàåìûå èòåðàòîðîì i â äèàïàçîíå [first, last), äëÿ êîòîðûõ âûïîëíåíû ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==*(i-1) èëè binary_pred(*i, *(i-1))==true. unique âîçâðàùàåò êîíåö âîçíèêàþùåãî â ðåçóëüòàòå äèàïàçîíà. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî (last-first)-1 ðàç.</p>
     <p><code>template ‹class InputIterator, class OutputIterator›</code></p>
     <p><code>OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class OutputIterator, class BinaryPredicate›</code></p>
     <p><code>OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred);</code></p>
     <p>unique_copy êîïèðóåò òîëüêî ïåðâûé ýëåìåíò èç êàæäîé ïîñëåäîâàòåëüíîé ãðóïïû ðàâíûõ ýëåìåíòîâ, óêàçûâàåìûõ èòåðàòîðîì i â äèàïàçîíå [first, last), äëÿ êîòîðûõ âûïîëíåíû ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *i==*(i-1) èëè binary_pied(*i, *(i-1))==true. unique_copy âîçâðàùàåò êîíåö âîçíèêàþùåãî â ðåçóëüòàòå äèàïàçîíà. Ñîîòâåòñòâóþùèé ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî (last-first)-1 ðàç.</p>
    </section>
    <section>
     <title>
      <p>Ðàñïîëîæèòü â îáðàòíîì ïîðÿäêå (Reverse)</p>
     </title>
     <p><code>template ‹class BidirectionalIterator›</code></p>
     <p><code>void reverse(BidirectionalIterator first, BidirectionalIterator last);</code></p>
     <p>Äëÿ êàæäîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëà i‹=(last-first)/2 ôóíêöèÿ reverse ïðèìåíÿåò ïåðåñòàíîâêó êî âñåì ïàðàì èòåðàòîðîâ first+i, (last-i)-1. Âûïîëíÿåòñÿ òî÷íî (last-first)/2 ïåðåñòàíîâîê.</p>
     <p><code>template ‹class BidirectionalIterator, class OutputIterator›</code></p>
     <p><code>OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);</code></p>
     <p>reverse_copy êîïèðóåò äèàïàçîí [first, last) â äèàïàçîí [result, result+(last-first)) òàêîé, ÷òî äëÿ ëþáîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëà i ‹ (last-first) ïðîèñõîäèò ñëåäóþùåå ïðèñâàèâàíèå: *(result+(last-first)-i) = *(first+i). reverse_copy âîçâðàùàåò result+(last-first). Äåëàåòñÿ òî÷íî last-first ïðèñâàèâàíèé. Ðåçóëüòàò reverse_copy íå îïðåäåë¸í, åñëè [first, last) è [result, result +(last-first)) ïåðåêðûâàþòñÿ.</p>
    </section>
    <section>
     <title>
      <p>Ïåðåìåñòèòü ïî êðóãó (Rotate)</p>
     </title>
     <p><code>template ‹class ForwardIterator›</code></p>
     <p><code>void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);</code></p>
     <p>Äëÿ êàæäîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëà i ‹ (last-first) ôóíêöèÿ rotate ïîìåùàåò ýëåìåíò èç ïîçèöèè first+i â ïîçèöèþ first+(i+(last-middle))%(last-first). [first, middle) è [middle, last) - äîïóñòèìûå äèàïàçîíû. Ìàêñèìàëüíî âûïîëíÿåòñÿ last-first ïåðåñòàíîâîê.</p>
     <p><code>template ‹class ForwardIterator, class OutputIterator›</code></p>
     <p><code>OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);</code></p>
     <p>rotate_copy êîïèðóåò äèàïàçîí [first, last) â äèàïàçîí [result, result+(last-first)) òàêîé, ÷òî äëÿ êàæäîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëà i ‹ (last-first) ïðîèñõîäèò ñëåäóþùåå ïðèñâàèâàíèå: *(result+(i+(last-middle))%(last-first)) = *(first+i). rotate_copy âîçâðàùàåò result+(last-first). Äåëàåòñÿ òî÷íî last-first ïðèñâàèâàíèé. Ðåçóëüòàò rotate_copy íå îïðåäåë¸í, åñëè [first, last) è [result, result+(last-first)) ïåðåêðûâàþòñÿ.</p>
    </section>
    <section>
     <title>
      <p>Ïåðåòàñîâàòü (Random shuffle)</p>
     </title>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void random_shuffle(RandomAccessIterator first, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class RandomNumberGenerator›</code></p>
     <p><code>void random_shuffie(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator&amp; rand);</code></p>
     <p>random_shuffle ïåðåñòàâëÿåò ýëåìåíòû â äèàïàçîíå [first, last) ñ ðàâíîìåðíûì ðàñïðåäåëåíèåì. Âûïîëíÿåòñÿ òî÷íî last-first ïåðåñòàíîâîê. random_shuffle ìîæåò áðàòü â êà÷åñòâå ïàðàìåòðà îñîáûé ãåíåðèðóþùèé ñëó÷àéíîå ÷èñëî ôóíêöèîíàëüíûé îáúåêò rand òàêîé, ÷òî rand áåð¸ò ïîëîæèòåëüíûé ïàðàìåòð n òèïà ðàññòîÿíèÿ RandomAccessIterator è âîçâðàùàåò ñëó÷àéíî âûáðàííîå çíà÷åíèå ìåæäó 0 è n-1.</p>
    </section>
    <section>
     <title>
      <p>Ðàçäåëèòü (Partitions)</p>
     </title>
     <p><code>template ‹class BidirectionalIterator, class Predicate›</code></p>
     <p><code>BidirectionalIterator partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred);</code></p>
     <p>partition ïîìåùàåò âñå ýëåìåíòû â äèàïàçîíå [first, last), êîòîðûå óäîâëåòâîðÿþò pred, ïåðåä âñåìè ýëåìåíòàìè, êîòîðûå íå óäîâëåòâîðÿþò. Âîçâðàùàåòñÿ èòåðàòîð i òàêîé, ÷òî äëÿ ëþáîãî èòåðàòîðà j â äèàïàçîíå [first, i) áóäåò pred(*j)==true, à äëÿ ëþáîãî èòåðàòîðà k â äèàïàçîíå [i, last) áóäåò pred(*k)==false. Äåëàåòñÿ ìàêñèìàëüíî (last-first)/2 ïåðåñòàíîâîê. Ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî last-first ðàç.</p>
     <p><code>template ‹class BidirectionalIterator, class Predicate›</code></p>
     <p><code>BidirectionalIterator stable_partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred);</code></p>
     <p>stable_partition ïîìåùàåò âñå ýëåìåíòû â äèàïàçîíå [first, last), êîòîðûå óäîâëåòâîðÿþò pred, ïåðåä âñåìè ýëåìåíòàìè, êîòîðûå íå óäîâëåòâîðÿþò. Âîçâðàùàåòñÿ èòåðàòîð i òàêîé, ÷òî äëÿ ëþáîãî èòåðàòîðà j â äèàïàçîíå [first, i) áóäåò pred(*j)==true, à äëÿ ëþáîãî èòåðàòîðà k â äèàïàçîíå [i, last) áóäåò pred(*k)==false. Îòíîñèòåëüíûé ïîðÿäîê ýëåìåíòîâ â îáåèõ ãðóïïàõ ñîõðàíÿåòñÿ. Äåëàåòñÿ ìàêñèìàëüíî (last-first)*log(last-first) ïåðåñòàíîâîê, íî òîëüêî ëèíåéíîå ÷èñëî ïåðåñòàíîâîê, åñëè èìååòñÿ äîñòàòî÷íàÿ äîïîëíèòåëüíàÿ ïàìÿòü. Ïðåäèêàò ïðèìåíÿåòñÿ òî÷íî last-first ðàç.</p>
    </section>
   </section>
   <section>
    <title>
     <p>Îïåðàöèè ñîðòèðîâêè è îòíîøåíèÿ (Sorting and related operations)</p>
    </title>
    <section>
     <p>Âñå îïåðàöèè â ýòîì ðàçäåëå èìåþò äâå âåðñèè: îäíà áåð¸ò â êà÷åñòâå ïàðàìåòðà ôóíêöèîíàëüíûé îáúåêò òèïà Compare, à äðóãàÿ èñïîëüçóåò operator‹.</p>
     <p>Compare - ôóíêöèîíàëüíûé îáúåêò, êîòîðûé âîçâðàùàåò çíà÷åíèå, îáðàòèìîå â bool. Compare comp èñïîëüçóåòñÿ ïîëíîñòüþ äëÿ àëãîðèòìîâ, ïðèíèìàþùèõ îòíîøåíèå óïîðÿäî÷åíèÿ. comp óäîâëåòâîðÿåò ñòàíäàðòíûì àêñèîìàì äëÿ ïîëíîãî óïîðÿäî÷åíèÿ è íå ïðèìåíÿåò íèêàêóþ íåïîñòîÿííóþ ôóíêöèþ ê ðàçûìåíîâàííîìó èòåðàòîðó. Äëÿ âñåõ àëãîðèòìîâ, êîòîðûå áåðóò Compare, èìååòñÿ âåðñèÿ, êîòîðàÿ èñïîëüçóåò operator‹ âçàìåí. Òî åñòü comp(*i, *j)==true ïî óìîë÷àíèþ äëÿ *i‹*j==true.</p>
     <p>Ïîñëåäîâàòåëüíîñòü ñîðòèðóåòñÿ îòíîñèòåëüíî êîìïàðàòîðà comp, åñëè äëÿ ëþáîãî èòåðàòîðà i, óêàçûâàþùåãî íà ýëåìåíò â ïîñëåäîâàòåëüíîñòè, è ëþáîãî íåîòðèöàòåëüíîãî öåëîãî ÷èñëå n òàêîãî, ÷òî i + n ÿâëÿåòñÿ äîïóñòèìûì èòåðàòîðîì, óêàçûâàþùèì íà ýëåìåíò òîé æå ñàìîé ïîñëåäîâàòåëüíîñòè, comp(*(i+n), *i)==false.</p>
     <p>Â îïèñàíèÿõ ôóíêöèé, êîòîðûå èìåþò äåëî ñ óïîðÿäî÷èâàþùèìè îòíîøåíèÿìè, ìû ÷àñòî èñïîëüçóåì ïðåäñòàâëåíèå ðàâåíñòâà, ÷òîáû îïèñàòü òàêèå ïîíÿòèÿ, êàê óñòîé÷èâîñòü. Ðàâåíñòâî, ê êîòîðîìó ìû îáðàùàåìñÿ, íå îáÿçàòåëüíî operator==, à îòíîøåíèå ðàâåíñòâà ñòèìóëèðóåòñÿ ïîëíûì óïîðÿäî÷åíèåì. Òî åñòü äâà ýëåìåíòa a è b ñ÷èòàþòñÿ ðàâíûìè, åñëè è òîëüêî åñëè !(a ‹ b)&amp;&amp;!(b ‹ a).</p>
    </section>
    <section>
     <title>
      <p>Ñîðòèðîâêà (Sort)</p>
     </title>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void sort(RandomAccessIterator first, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void sort(RandomAccessIterator first, RandomAccessIterator last, Compare ñîmð);</code></p>
     <p>sort ñîðòèðóåò ýëåìåíòû â äèàïàçîíå [first, last). Äåëàåòñÿ ïðèáëèçèòåëüíî NIogN (ãäå N ðàâíÿåòñÿ last-first) ñðàâíåíèé â ñðåäíåì. Åñëè ðåæèì íàèõóäøåãî ñëó÷àÿ âàæåí, äîëæíû èñïîëüçîâàòüñÿ stable_sort èëè partial_sort.</p>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void stable_sort(RandomAccessIterator first, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);</code></p>
     <p>stable_sort ñîðòèðóåò ýëåìåíòû â äèàïàçîíå [first, last). Îí óñòîé÷èâ, òî åñòü îòíîñèòåëüíûé ïîðÿäîê ðàâíûõ ýëåìåíòîâ ñîõðàíÿåòñÿ. Äåëàåòñÿ ìàêñèìóì N(logN)<sup>2</sup> (ãäå N ðàâíÿåòñÿ last-first) ñðàâíåíèé; åñëè äîñòóïíà äîñòàòî÷íàÿ äîïîëíèòåëüíàÿ ïàìÿòü, òîãäà ýòî - NlogN.</p>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);</code></p>
     <p>partial_sort ïîìåùàåò ïåðâûå middle - first ñîðòèðîâàííûõ ýëåìåíòîâ èç äèàïàçîíà [first, last) â äèàïàçîí [first, middle). Îñòàëüíàÿ ÷àñòü ýëåìåíòîâ â äèàïàçîíå [middle, last) ïîìåùåíà â íåîïðåäåë¸ííîì ïîðÿäêå. Áåð¸òñÿ ïðèáëèçèòåëüíî (last-first)*log(middle-first) ñðàâíåíèé.</p>
     <p><code>template ‹class InputIterator, class RandomAccessIterator›</code></p>
     <p><code>RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class RandomAccessIterator, class Compare›</code></p>
     <p><code>RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);</code></p>
     <p>partial_sort_copy ïîìåùàåò ïåðâûå min(last-first, result_last-result_first) ñîðòèðîâàííûõ ýëåìåíòîâ â äèàïàçîí [result_first, result_first+min(last-first, result_last-result_first)). Âîçâðàùàåòñÿ èëè result_last, èëè result_first+(last-first), êàêîé ìåíüøå. Áåð¸òñÿ ïðèáëèçèòåëüíî (last-first)*log(min(last-first, result_last-result_first)) ñðàâíåíèé.</p>
    </section>
    <section>
     <title>
      <p>N-é ýëåìåíò (Nth element)</p>
     </title>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);</code></p>
     <p>Ïîñëå îïåðàöèè nth_element ýëåìåíò â ïîçèöèè, óêàçàííîé nth, ÿâëÿåòñÿ ýëåìåíòîì, êîòîðûé áûë áû â òîé ïîçèöèè, åñëè áû ñîðòèðîâàëñÿ öåëûé äèàïàçîí. Òàêæå äëÿ ëþáîãî èòåðàòîðà i â äèàïàçîíå [first, nth) è ëþáîãî èòåðàòîðà j â äèàïàçîíå [nth, last) ñ÷èòàåòñÿ, ÷òî !(*i › *j) èëè comp(*i, *j)==false. Îïåðàöèÿ ëèíåéíà â ñðåäíåì.</p>
    </section>
    <section>
     <title>
      <p>Äâîè÷íûé ïîèñê (Binary search)</p>
     </title>
     <p>Âñå àëãîðèòìû â ýòîì ðàçäåëå - âåðñèè äâîè÷íîãî ïîèñêà. Îíè ðàáîòàþò ñ èòåðàòîðàìè íå ïðîèçâîëüíîãî äîñòóïà, óìåíüøàÿ ÷èñëî ñðàâíåíèé, êîòîðîå áóäåò ëîãàðèôìè÷åñêèì äëÿ âñåõ òèïîâ èòåðàòîðîâ. Îíè îñîáåííî ïîäõîäÿò äëÿ èòåðàòîðîâ ïðîèçâîëüíîãî äîñòóïà, òàê êàê ýòè àëãîðèòìû äåëàþò ëîãàðèôìè÷åñêîå ÷èñëî øàãîâ â ñòðóêòóðå äàííûõ. Äëÿ èòåðàòîðîâ íå ïðîèçâîëüíîãî äîñòóïà îíè âûïîëíÿþò ëèíåéíîå ÷èñëî øàãîâ.</p>
     <p><code>template ‹class ForwardIterator, class T›</code></p>
     <p><code>ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class T, class Compare›</code></p>
     <p><code>ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T&amp; value, Compare comp);</code></p>
     <p>lower_bound íàõîäèò ïåðâóþ ïîçèöèþ, â êîòîðóþ value ìîæåò áûòü âñòàâëåíî áåç íàðóøåíèÿ óïîðÿäî÷åíèÿ. lower_bound âîçâðàùàåò ñàìûé äàëüíèé èòåðàòîð i â äèàïàçîíå [first, last) òàêîé, ÷òî äëÿ ëþáîãî èòåðàòîðà j â äèàïàçîíå [first, i) âûïîëíÿþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: *j‹value èëè comp(*j, value)==true. Äåëàåòñÿ ìàêñèìóì log(last-first)+1 ñðàâíåíèé.</p>
     <p><code>template ‹class ForwardIterator, class T›</code></p>
     <p><code>ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class T, class Compare›</code></p>
     <p><code>ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T&amp; value, Compare comp);</code></p>
     <p>upper_bound íàõîäèò ñàìóþ äàëüíþþ ïîçèöèþ, â êîòîðóþ value ìîæåò áûòü âñòàâëåíî áåç íàðóøåíèÿ óïîðÿäî÷åíèÿ. upper_bound âîçâðàùàåò ñàìûé äàëüíèé èòåðàòîð i â äèàïàçîíå [first, last) òàêîé, ÷òî äëÿ ëþáîãî èòåðàòîðà j â äèàïàçîíå [first, i) âûïîëíÿþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: !(value‹*j) èëè comp(value, *j)==false. Äåëàåòñÿ ìàêñèìóì log(last-first)+1 ñðàâíåíèé.</p>
     <p><code>template ‹class ForwardIterator, class T›</code></p>
     <p><code>ForwardIterator equal_range(ForwardIterator first, ForwardIterator last, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class T, class Compare›</code></p>
     <p><code>ForwardIterator equal_range(ForwardIterator first, ForwardIterator last, const T&amp; value, Compare comp);</code></p>
     <p>equal_range íàõîäèò ñàìûé áîëüøîé ïîääèàïàçîí [i, j) òàêîé, ÷òî çíà÷åíèå ìîæåò áûòü âñòàâëåíî ïî ëþáîìó èòåðàòîðó k â í¸ì. k óäîâëåòâîðÿåò ñîîòâåòñòâóþùèì óñëîâèÿì: !(*k ‹ value)&amp;&amp;!(value ‹ *k) èëè comp(*k, value)==false&amp;&amp; comp(value, *k)==false. Äåëàåòñÿ ìàêñèìóì 2*log(last-first)+1 ñðàâíåíèé.</p>
     <p><code>template ‹class ForwardIterator, class T›</code></p>
     <p><code>ForwardIterator binary_search(ForwardIterator first, ForwardIterator last, const T&amp; value);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class T, class Compare›</code></p>
     <p><code>ForwardIterator binary_search(ForwardIterator first, ForwardIterator last, const T&amp; value, Compare comp);</code></p>
     <p>binary_search âîçâðàùàåò èñòèíó, åñëè â äèàïàçîíå [first, last) èìååòñÿ èòåðàòîð i, êîòîðûé óäîâëåòâîðÿåò ñîîòâåòñòâóþùèì óñëîâèÿì: !(*i ‹ value)&amp;&amp;!(value ‹ *i) èëè comp(*i, value)==false&amp;&amp;comp(value, *i)==false. Äåëàåòñÿ ìàêñèìóì log(last-first)+2 ñðàâíåíèé.</p>
    </section>
    <section>
     <title>
      <p>Îáúåäèíåíèå (Merge)</p>
     </title>
     <p><code>template ‹class InputIterator1, class Input Iterator2, class OutputIterator›</code></p>
     <p><code>OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator, class Compare›</code></p>
     <p><code>OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);</code></p>
     <p>merge îáúåäèíÿåò äâà ñîðòèðîâàííûõ äèàïàçîíà [first1, last1) è [first2, last2) â äèàïàçîí [result, result+(last1-first1)+(last2-first2)). Îáúåäèíåíèå óñòîé÷èâî, òî åñòü äëÿ ðàâíûõ ýëåìåíòîâ â äâóõ äèàïàçîíàõ ýëåìåíòû èç ïåðâîãî äèàïàçîíà âñåãäà ïðåäøåñòâóþò ýëåìåíòàì èç âòîðîãî. merge âîçâðàùàåò result+(last1-first1)+(last2-first2). Âûïîëíÿåòñÿ ìàêñèìàëüíî (last1-first1)+(last2-first2)-1 ñðàâíåíèé. Ðåçóëüòàò merge íå îïðåäåë¸í, åñëè âîçíèêàþùèé â ðåçóëüòàòå äèàïàçîí ïåðåêðûâàåòñÿ ñ ëþáûì èç ïåðâîíà÷àëüíûõ äèàïàçîíîâ.</p>
     <p><code>template ‹class BidirectionalIterator›</code></p>
     <p><code>void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class BidirectionalIterator, class Compare›</code></p>
     <p><code>void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);</code></p>
     <p>inplace_merge îáúåäèíÿåò äâà ñîðòèðîâàííûõ ïîñëåäîâàòåëüíûõ äèàïàçîíà [first, middle) è [middle, last), ïîìåùàÿ ðåçóëüòàò îáúåäèíåíèÿ â äèàïàçîí [first, last). Îáúåäèíåíèå óñòîé÷èâî, òî åñòü äëÿ ðàâíûõ ýëåìåíòîâ â äâóõ äèàïàçîíàõ ýëåìåíòû èç ïåðâîãî äèàïàçîíà âñåãäà ïðåäøåñòâóþò ýëåìåíòàì èç âòîðîãî. Êîãäà äîñòóïíî äîñòàòî÷íî äîïîëíèòåëüíîé ïàìÿòè, âûïîëíÿåòñÿ ìàêñèìàëüíî (last-first)-1 ñðàâíåíèé. Åñëè íèêàêàÿ äîïîëíèòåëüíàÿ ïàìÿòü íå äîñòóïíà, ìîæåò èñïîëüçîâàòüñÿ àëãîðèòì ñî ñëîæíîñòüþ O(NlogN).</p>
    </section>
    <section>
     <title>
      <p>Îïåðàöèè íàä ìíîæåñòâîì äëÿ ñîðòèðîâàííûõ ñòðóêòóð (Set operations on sorted structures)</p>
     </title>
     <p>Ýòîò ðàçäåë îïðåäåëÿåò âñå îñíîâíûå îïåðàöèè íàä ìíîæåñòâîì äëÿ ñîðòèðîâàííûõ ñòðóêòóð. Îíè äàæå ðàáîòàþò ñ ìíîæåñòâàìè ñ äóáëèêàòàìè, ñîäåðæàùèìè ìíîæåñòâåííûå êîïèè ðàâíûõ ýëåìåíòîâ. Ñåìàíòèêà îïåðàöèé íàä ìíîæåñòâîì îáîáùåíà íà ìíîæåñòâà ñ äóáëèêàòàìè ñòàíäàðòíûì ñïîñîáîì, îïðåäåëÿÿ îáúåäèíåíèå, ñîäåðæàùåå ìàêñèìàëüíîå ÷èñëî ìåñòîíàõîæäåíèé êàæäîãî ýëåìåíòà, ïåðåñå÷åíèå, ñîäåðæàùåå ìèíèìóì, è òàê äàëåå.</p>
     <p><code>template ‹class InputIterator1, class InputIterator2›</code></p>
     <p><code>bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class Compare›</code></p>
     <p><code>bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);</code></p>
     <p>includes âîçâðàùàåò true, åñëè êàæäûé ýëåìåíò â äèàïàçîíå [first2, last2) ñîäåðæèòñÿ â äèàïàçîíå [first1, last1). Èíà÷å âîçâðàùàåòñÿ false. Âûïîëíÿåòñÿ ìàêñèìàëüíî ((last1-first1)+(last2-first2))*2-1 ñðàâíåíèé.</p>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator›</code></p>
     <p><code>OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator, class Compare›</code></p>
     <p><code>OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);</code></p>
     <p>set_union ñîçäà¸ò ñîðòèðîâàííîå îáúåäèíåíèå ýëåìåíòîâ èç äâóõ äèàïàçîíîâ. Îí âîçâðàùàåò êîíåö ñîçäàííîãî äèàïàçîíà. set_union óñòîé÷èâ, òî åñòü, åñëè ýëåìåíò ïðèñóòñòâóåò â îáîèõ äèàïàçîíàõ, îí êîïèðóåòñÿ èç ïåðâîãî äèàïàçîíà. Âûïîëíÿåòñÿ ìàêñèìàëüíî ((last1-first1)+(last2-first2))*2-1 ñðàâíåíèé. Ðåçóëüòàò set_union íå îïðåäåë¸í, åñëè âîçíèêàþùèé â ðåçóëüòàòå äèàïàçîí ïåðåêðûâàåòñÿ ñ ëþáûì èç ïåðâîíà÷àëüíûõ äèàïàçîíîâ.</p>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator›</code></p>
     <p><code>OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator, class Compare›</code></p>
     <p><code>OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);</code></p>
     <p>set_intersection ñîçäà¸ò ñîðòèðîâàííîå ïåðåñå÷åíèå ýëåìåíòîâ èç äâóõ äèàïàçîíîâ. Îí âîçâðàùàåò êîíåö ñîçäàííîãî äèàïàçîíà. Ãàðàíòèðóåòñÿ, ÷òî set_intersection óñòîé÷èâ, òî åñòü, åñëè ýëåìåíò ïðèñóòñòâóåò â îáîèõ äèàïàçîíàõ, îí êîïèðóåòñÿ èç ïåðâîãî äèàïàçîíà. Âûïîëíÿåòñÿ ìàêñèìàëüíî ((last1-first1)+(last2-first2))*2-1 ñðàâíåíèé. Ðåçóëüòàò set_union íå îïðåäåë¸í, åñëè âîçíèêàþùèé â ðåçóëüòàòå äèàïàçîí ïåðåêðûâàåòñÿ ñ ëþáûì èç ïåðâîíà÷àëüíûõ äèàïàçîíîâ.</p>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator›</code></p>
     <p><code>OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator, class Compare›</code></p>
     <p><code>OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);</code></p>
     <p>set_difference ñîçäà¸ò ñîðòèðîâàííóþ ðàçíîñòü ýëåìåíòîâ èç äâóõ äèàïàçîíîâ. Îí âîçâðàùàåò êîíåö ñîçäàííîãî äèàïàçîíà. Âûïîëíÿåòñÿ ìàêñèìàëüíî ((last1-first1)+(last2-first2))*2-  ñðàâíåíèé. Ðåçóëüòàò set_difference íå îïðåäåë¸í, åñëè âîçíèêàþùèé â ðåçóëüòàòå äèàïàçîí ïåðåêðûâàåòñÿ ñ ëþáûì èç ïåðâîíà÷àëüíûõ äèàïàçîíîâ.</p>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator›</code></p>
     <p><code>OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class OutputIterator, class Compare›</code></p>
     <p><code>OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);</code></p>
     <p>set_symmetric_difference ñîçäà¸ò ñîðòèðîâàííóþ ñèììåòðè÷íóþ ðàçíîñòü ýëåìåíòîâ èç äâóõ äèàïàçîíîâ. Îí âîçâðàùàåò êîíåö ñîçäàííîãî äèàïàçîíà. Âûïîëíÿåòñÿ ìàêñèìàëüíî ((last1-first1)+(last2-first2))*2-1 ñðàâíåíèé. Ðåçóëüòàò set_symmetric_difference íå îïðåäåë¸í, åñëè âîçíèêàþùèé â ðåçóëüòàòå äèàïàçîí ïåðåêðûâàåòñÿ ñ ëþáûì èç ïåðâîíà÷àëüíûõ äèàïàçîíîâ.</p>
    </section>
    <section>
     <title>
      <p>Îïåðàöèè íàä ïèðàìèäàìè (Heap operations)</p>
     </title>
     <p>Ïèðàìèäà - ñïåöèôè÷åñêàÿ îðãàíèçàöèÿ ýëåìåíòîâ â äèàïàçîíå ìåæäó äâóìÿ èòåðàòîðàìè ïðîèçâîëüíîãî äîñòóïà [a, b). Äâà å¸ êëþ÷åâûå ñâîéñòâà: (1) *a - ñàìûé áîëüøîé ýëåìåíò â äèàïàçîíå, (2) *a ìîæåò áûòü óäàë¸í ñ ïîìîùüþ pop_heap èëè íîâûé ýëåìåíò äîáàâëåí ñ ïîìîùüþ push_heap çà O(logN) âðåìÿ. Ýòè ñâîéñòâà äåëàþò ïèðàìèäû ïîëåçíûìè äëÿ ïðèîðèòåòíûõ î÷åðåäåé. make_heap ïðåîáðàçîâûâàåò äèàïàçîí â ïèðàìèäó, a sort_heap ïðåâðàùàåò ïèðàìèäó â ñîðòèðîâàííóþ ïîñëåäîâàòåëüíîñòü.</p>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void push_heap(RandomAccessIterator first, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);</code></p>
     <p>push_heap ïîëàãàåò, ÷òî äèàïàçîí [first, last-1) ÿâëÿåòñÿ ñîîòâåòñòâóþùåé ïèðàìèäîé, è íàäëåæàùèì îáðàçîì ïîìåùàåò çíà÷åíèå ñ ïîçèöèè last-1 â ðåçóëüòèðóþùóþ ïèðàìèäó [first, last). Âûïîëíÿåòñÿ ìàêñèìàëüíî log(last-first) ñðàâíåíèé.</p>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void pop_heap(RandomAccessIterator first, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);</code></p>
     <p>pop_heap ïîëàãàåò, ÷òî äèàïàçîí [first, last) ÿâëÿåòñÿ ñîîòâåòñòâóþùåé ïèðàìèäîé, çàòåì îáìåíèâàåò çíà÷åíèÿ â ïîçèöèÿõ first è last-1 è ïðåâðàùàåò [first, last-1) â ïèðàìèäó. Âûïîëíÿåòñÿ ìàêñèìàëüíî 2*log(last-first) ñðàâíåíèé.</p>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void make_heap(RandomAccessIterator first, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);</code></p>
     <p>make_heap ñîçäàåò ïèðàìèäó èç äèàïàçîíà [first, last). Âûïîëíÿåòñÿ ìàêñèìàëüíî 3*(last-first) ñðàâíåíèé.</p>
     <p><code>template ‹class RandomAccessIterator›</code></p>
     <p><code>void sort_heap(RandomAccessIterator first, RandomAccessIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class Compare›</code></p>
     <p><code>void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);</code></p>
     <p>sort_heap ñîðòèðóåò ýëåìåíòû â ïèðàìèäå [first, last). Âûïîëíÿåòñÿ ìàêñèìàëüíî NlogN ñðàâíåíèé, ãäå N ðàâíî last-first. sort_heap íå óñòîé÷èâ.</p>
    </section>
    <section>
     <title>
      <p>Ìèíèìóì è ìàêñèìóì (Minimum and maximum)</p>
     </title>
     <p><code>template ‹class T›</code></p>
     <p><code>const T&amp; min(const T&amp; a, const T&amp; b);</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Compare›</code></p>
     <p><code>const T&amp; min(const T&amp; a, const T&amp; b, Compare comp);</code></p>
     <empty-line/>
     <p><code>template ‹class T›</code></p>
     <p><code>const T&amp; max(const T&amp; a, const T&amp; b);</code></p>
     <empty-line/>
     <p><code>template ‹class T, class Compare›</code></p>
     <p><code>const T&amp; max(const T&amp; a, const T&amp; b, Compare comp);</code></p>
     <p>min âîçâðàùàåò ìåíüøåå, à max áîëüøåå. min è max âîçâðàùàþò ïåðâûé ïàðàìåòð, êîãäà èõ ïàðàìåòðû ðàâíû.</p>
     <p><code>template ‹class ForwardIterator›</code></p>
     <p><code>ForwardIterator max_element(ForwardIterator first, ForwardIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class Compare›</code></p>
     <p><code>ForwardIterator max_element(ForwardIterator first, ForwardIterator last, Compare comp);</code></p>
     <p>max_element âîçâðàùàåò ïåðâûé òàêîé èòåðàòîð i â äèàïàçîíå [first, last), ÷òî äëÿ ëþáîãî èòåðàòîðà j â äèàïàçîíå [first, last) âûïîëíÿþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: !(*i‹*j) èëè comp(*i, *j)==false. Âûïîëíÿåòñÿ òî÷íî max((last-first)-1, 0) ñîîòâåòñòâóþùèõ ñðàâíåíèé.</p>
     <p><code>template ‹class ForwardIterator›</code></p>
     <p><code>ForwardIterator min_element(ForwardIterator first, ForwardIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class ForwardIterator, class Compare›</code></p>
     <p><code>ForwardIterator min_element(ForwardIterator first, ForwardIterator last, Compare comp);</code></p>
     <p>min_element âîçâðàùàåò ïåðâûé òàêîé èòåðàòîð i â äèàïàçîíå [first, last), ÷òî äëÿ ëþáîãî èòåðàòîðà j â äèàïàçîíå [first, last) âûïîëíÿþòñÿ ñëåäóþùèå ñîîòâåòñòâóþùèå óñëîâèÿ: !(*j‹*i) èëè comp(*j, *i)==false. Âûïîëíÿåòñÿ òî÷íî max((last-first)-1, 0) ñîîòâåòñòâóþùèõ ñðàâíåíèé.</p>
    </section>
    <section>
     <title>
      <p>Ëåêñèêîãðàôè÷åñêîå ñðàâíåíèå (Lexicographical comparison)</p>
     </title>
     <p><code>template ‹class InputIterator1, class InputIterator2›</code></p>
     <p><code>bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class Compare›</code></p>
     <p><code>bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);</code></p>
     <p>lexicographical_compare âîçâðàùàåò true, åñëè ïîñëåäîâàòåëüíîñòü ýëåìåíòîâ, îïðåäåë¸ííûõ äèàïàçîíîì [first1, last1), ëåêñèêîãðàôè÷åñêè ìåíüøå, ÷åì ïîñëåäîâàòåëüíîñòü ýëåìåíòîâ, îïðåäåë¸ííûõ äèàïàçîíîì [first2, last2). Èíà÷å îí âîçâðàùàåò ëîæü. Âûïîëíÿåòñÿ ìàêñèìàëüíî 2*min((last1-first1), (last2-first2)) ñðàâíåíèé.</p>
    </section>
    <section>
     <title>
      <p>Ãåíåðàòîðû ïåðåñòàíîâîê (Permutation generators)</p>
     </title>
     <p><code>template ‹class BidirectionalIterator›</code></p>
     <p><code>bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class BidirectionalIterator, class Compare›</code></p>
     <p><code>bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);</code></p>
     <p>next_permutation áåð¸ò ïîñëåäîâàòåëüíîñòü, îïðåäåë¸ííóþ äèàïàçîíîì [first, last), è òðàíñôîðìèðóåò å¸ â ñëåäóþùóþ ïåðåñòàíîâêó. Ñëåäóþùàÿ ïåðåñòàíîâêà íàõîäèòñÿ, ïîëàãàÿ, ÷òî ìíîæåñòâî âñåõ ïåðåñòàíîâîê ëåêñèêîãðàôè÷åñêè ñîðòèðîâàíî îòíîñèòåëüíî operator‹ èëè comp. Åñëè òàêàÿ ïåðåñòàíîâêà ñóùåñòâóåò, âîçâðàùàåòñÿ true. Èíà÷å îí òðàíñôîðìèðóåò ïîñëåäîâàòåëüíîñòü â ñàìóþ ìàëåíüêóþ ïåðåñòàíîâêó, òî åñòü ñîðòèðîâàííóþ ïî âîçðàñòàíèþ, è âîçâðàùàåò false. Ìàêñèìàëüíî âûïîëíÿåòñÿ (last-first)/2 ïåðåñòàíîâîê.</p>
     <p><code>template ‹class BidirectionalIterator›</code></p>
     <p><code>bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last);</code></p>
     <empty-line/>
     <p><code>template ‹class BidirectionalIterator, class Compare›</code></p>
     <p><code>bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);</code></p>
     <p>prev_permutation áåð¸ò ïîñëåäîâàòåëüíîñòü, îïðåäåë¸ííóþ äèàïàçîíîì [first, last), è òðàíñôîðìèðóåò å¸ â ïðåäûäóùóþ ïåðåñòàíîâêó. Ïðåäûäóùàÿ ïåðåñòàíîâêà íàõîäèòñÿ, ïîëàãàÿ, ÷òî ìíîæåñòâî âñåõ ïåðåñòàíîâîê ëåêñèêîãðàôè÷åñêè ñîðòèðîâàíî îòíîñèòåëüíî operator‹ èëè comp. Åñëè òàêàÿ ïåðåñòàíîâêà ñóùåñòâóåò, âîçâðàùàåòñÿ true. Èíà÷å îí òðàíñôîðìèðóåò ïîñëåäîâàòåëüíîñòü â ñàìóþ áîëüøóþ ïåðåñòàíîâêó, òî åñòü ñîðòèðîâàííóþ ïî óáûâàíèþ, è âîçâðàùàåò false. Ìàêñèìàëüíî âûïîëíÿåòñÿ (last - first)/2 ïåðåñòàíîâîê.</p>
    </section>
   </section>
   <section>
    <title>
     <p>Îáîáù¸ííûå ÷èñëåííûå îïåðàöèè (Generalized numeric operations)</p>
    </title>
    <section>
     <title>
      <p>Íàêîïëåíèå (Accumulate)</p>
     </title>
     <p><code>template ‹class InputIterator, class T›</code></p>
     <p><code>T accumulate(InputIterator first, InputIterator last, T init);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class T, class BinaryOperation›</code></p>
     <p><code>T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);</code></p>
     <p>accumulate ïîäîáåí îïåðàòîðó APL <emphasis>reduction</emphasis> è ôóíêöèè Common Lisp <emphasis>reduce</emphasis>, íî îí èçáåãàåò òðóäíîñòè îïðåäåëåíèÿ ðåçóëüòàòà óìåíüøåíèÿ äëÿ ïóñòîé ïîñëåäîâàòåëüíîñòè, âñåãäà òðåáóÿ íà÷àëüíîå çíà÷åíèå. Íàêîïëåíèå âûïîëíÿåòñÿ èíèöèàëèçàöèåé ñóììàòîðà acc íà÷àëüíûì çíà÷åíèåì init è ïîñëåäóþùèì èçìåíåíèåì åãî acc = acc+*i èëè acc = binary_op(acc, *i) äëÿ êàæäîãî èòåðàòîðà i â äèàïàçîíå [first, last) ïî ïîðÿäêó. Ïðåäïîëàãàåòñÿ, ÷òî binary_op íå âûçûâàåò ïîáî÷íûõ ýôôåêòîâ.</p>
    </section>
    <section>
     <title>
      <p>Ñêàëÿðíîå ïðîèçâåäåíèå (Inner product)</p>
     </title>
     <p><code>template ‹class InputIterator1, class InputIterator2, class T›</code></p>
     <p><code>T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2›</code></p>
     <p><code>T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);</code></p>
     <p>inner_product âû÷èñëÿåò ñâîé ðåçóëüòàò, èíèöèàëèçèðóÿ ñóììàòîð acc íà÷àëüíûì çíà÷åíèåì init è çàòåì èçìåíÿÿ åãî acc = acc+(*i1)*(*i2) èëè acc = binary_op1(acc, binary_op2(*i1, *i2)) äëÿ êàæäîãî èòåðàòîðà i1 â äèàïàçîíå [first, last) è èòåðàòîðà i2 â äèàïàçîíå [first2, first2+(last-first)) ïî ïîðÿäêó. Ïðåäïîëàãàåòñÿ, ÷òî binary_op1 è binary_op2 íå âûçûâàþò ïîáî÷íûõ ýôôåêòîâ.</p>
    </section>
    <section>
     <title>
      <p>×àñòè÷íàÿ ñóììà (Partial sum)</p>
     </title>
     <p><code>template ‹class InputIterator, class OutputIterator›</code></p>
     <p><code>OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class OutputIterator, class BinaryOperation›</code></p>
     <p><code>OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);</code></p>
     <p>partial_sum ïðèñâàèâàåò êàæäîìó èòåðàòîðó i â äèàïàçîíå [result, result+(last-first)) çíà÷åíèå, ñîîòâåòñòâåííî ðàâíîå ((…(*first+*(first+1))+…)+*(first+(i-result))) èëè binary_op(binary_op(…, binary_op(*first, *(first+1)),…), *(first+(i-result))). Ôóíêöèÿ partial_sum âîçâðàùàåò result+(last-first). Âûïîëíÿåòñÿ binary_op òî÷íî (last-first)-1 ðàç. Îæèäàåòñÿ, ÷òî binary_op íå èìååò êàêèõ-ëèáî ïîáî÷íûõ ýôôåêòîâ. result ìîæåò áûòü ðàâåí first.</p>
    </section>
    <section>
     <title>
      <p>Ñìåæíàÿ ðàçíîñòü (Adjacent difference)</p>
     </title>
     <p><code>template ‹class InputIterator, class OutputIterator›</code></p>
     <p><code>OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result);</code></p>
     <empty-line/>
     <p><code>template ‹class InputIterator, class OutputIterator, class BinaryOperation›</code></p>
     <p><code>OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);</code></p>
     <p>adjacent_difference ïðèñâàèâàåò êàæäîìó ýëåìåíòó, óêàçûâàåìîìó èòåðàòîðîì i â äèàïàçîíå [result+1, result+(last-first)) çíà÷åíèå, ñîîòâåòñòâåííî ðàâíîå *(first+(i-result))-*(first+(i-result)-1) èëè binary_op(*(first+(i-result)), *(first+(i-result)-1)). Ýëåìåíò, óêàçûâàåìûé result, ïîëó÷àåò çíà÷åíèå *first. Ôóíêöèÿ adjacent_difference âîçâðàùàåò result+(last-first). Ïðèìåíÿåòñÿ binary_op òî÷íî (last-first)-1 ðàç. Îæèäàåòñÿ, ÷òî binary_op íå èìååò êàêèõ-ëèáî ïîáî÷íûõ ýôôåêòîâ. result ìîæåò áûòü ðàâåí first.</p>
    </section>
   </section>
  </section>
  <section>
   <title>
    <p>ÀÄÀÏÒÅÐÛ</p>
   </title>
   <section>
    <p>Àäàïòåðû - øàáëîííûå êëàññû, êîòîðûå îáåñïå÷èâàþò îòîáðàæåíèÿ èíòåðôåéñà. Íàïðèìåð, insert_iterator îáåñïå÷èâàåò êîíòåéíåð èíòåðôåéñîì èòåðàòîðà âûâîäà.</p>
   </section>
   <section>
    <title>
     <p>Àäàïòåðû êîíòåéíåðîâ (Container adaptors)</p>
    </title>
    <section>
     <p>×àñòî áûâàåò ïîëåçíî îáåñïå÷èòü îãðàíè÷åííûå èíòåðôåéñû êîíòåéíåðîâ. Áèáëèîòåêà ïðåäîñòàâëÿåò stack, queue è priority_queue ÷åðåç àäàïòåðû, êîòîðûå ìîãóò ðàáîòàòü ñ ðàçëè÷íûìè òèïàìè ïîñëåäîâàòåëüíîñòåé.</p>
    </section>
    <section>
     <title>
      <p>Ñòåê (Stack)</p>
     </title>
     <p>Ëþáàÿ ïîñëåäîâàòåëüíîñòü, ïîääåðæèâàþùàÿ îïåðàöèè back, push_back è pop_back, ìîæåò èñïîëüçîâàòüñÿ äëÿ ìîäèôèêàöèè stack. Â ÷àñòíîñòè, ìîãóò èñïîëüçîâàòüñÿ vector, list è deque.</p>
     <p><code>template ‹class Container›</code></p>
     <p><code>class stack {</code></p>
     <p><code> friend bool operator==(const stack‹Container›&amp; õ, const stack‹Container›&amp; y);</code></p>
     <p><code> friend bool operator‹(const stack‹Container›&amp; õ, const stack‹Container›&amp; y);</code></p>
     <p><code>public:</code></p>
     <p><code> typedef Container::value_type value_type;</code></p>
     <p><code> typedef Container::size_type size_type;</code></p>
     <p><code>protected:</code></p>
     <p><code> Container c;</code></p>
     <p><code>public:</code></p>
     <p><code> bool empty() const {return c.empty();}</code></p>
     <p><code> size_type size() const {return c.size();}</code></p>
     <p><code> value_type&amp; top() {return c.back();}</code></p>
     <p><code> const value_type&amp; top() const {return c.back();}</code></p>
     <p><code> void push(const value_type&amp; õ) {ñ.push_back(õ);}</code></p>
     <p><code> void pop() {c.pop_back();}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>bool operator==(const stack ‹Container›&amp; õ, const stack‹Container›&amp; y) {return õ.ñ == ó.ñ;}</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>bool operator‹(const stack‹Container›&amp; õ, const stack‹Container›&amp; y) {return õ.ñ ‹ ó.ñ;}</code></p>
     <p>Íàïðèìåð, stack‹vector‹int› › - öåëî÷èñëåííûé ñòåê, ñäåëàííûé èç vector, à stack‹deque‹char› › - ñèìâîëüíûé ñòåê, ñäåëàííûé èç deque.</p>
    </section>
    <section>
     <title>
      <p>Î÷åðåäü (Queue)</p>
     </title>
     <p>Ëþáàÿ ïîñëåäîâàòåëüíîñòü, ïîääåðæèâàþùàÿ îïåðàöèè front, push_back è pop_front, ìîæåò èñïîëüçîâàòüñÿ äëÿ ìîäèôèêàöèè queue. Â ÷àñòíîñòè, ìîãóò èñïîëüçîâàòüñÿ list è deque.</p>
     <p><code>template ‹class Container›</code></p>
     <p><code>class queue {</code></p>
     <p><code> friend bool operator==(const queue‹Container›&amp; õ, const queue‹Container›&amp; y);</code></p>
     <p><code> friend bool operator‹(const queue‹Container›&amp; õ, const queue‹Container›&amp; y);</code></p>
     <p><code>public:</code></p>
     <p><code> typedef Container::value_type value_type;</code></p>
     <p><code> typedef Container::size_type size_type;</code></p>
     <p><code>protected:</code></p>
     <p><code> Container c;</code></p>
     <p><code>public:</code></p>
     <p><code> bool empty() const {return c.empty();}</code></p>
     <p><code> size_type size() const {return c.size();}</code></p>
     <p><code> value_type&amp; front() {return c.front();}</code></p>
     <p><code> const value_type&amp; front() const {return c.front();}</code></p>
     <p><code> value_type&amp; back() {return c.back();}</code></p>
     <p><code> const value_type&amp; back() const {return c.back();}</code></p>
     <p><code> void push(const value_type&amp; õ) {ñ.push_back(õ);}</code></p>
     <p><code> void pop() {ñ.pop_front();}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>bool operator==(const queue‹Container›&amp; õ, const queue‹Container›&amp; y) {return õ.ñ == ó.ñ;}</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>bool operator‹(const queue‹Container›&amp; õ, const queue‹Container›&amp; y) {return õ.ñ ‹ ó.ñ;}</code></p>
    </section>
    <section>
     <title>
      <p>Î÷åðåäü ñ ïðèîðèòåòàìè (Priority queue)</p>
     </title>
     <p>Ëþáàÿ ïîñëåäîâàòåëüíîñòü, ñ èòåðàòîðîì ïðîèçâîëüíîãî äîñòóïà è ïîääåðæèâàþùàÿ îïåðàöèè front, push_back è pop_front, ìîæåò èñïîëüçîâàòüñÿ äëÿ ìîäèôèêàöèè priority_queue. Â ÷àñòíîñòè, ìîãóò èñïîëüçîâàòüñÿ vector è deque.</p>
     <p><code>template ‹class Container, class Compare = less‹Container::value_type› ›</code></p>
     <p><code>class priority_queue {</code></p>
     <p><code>public:</code></p>
     <p><code> typedef Container::value_type value_type;</code></p>
     <p><code> typedef Container::size_type size_type;</code></p>
     <p><code>protected:</code></p>
     <p><code> Container c;</code></p>
     <p><code> Compare comp;</code></p>
     <p><code>public:</code></p>
     <p><code> priority_queue(const Compare&amp; õ = Compare()): c(), comp(õ) {}</code></p>
     <p><code> template ‹class InputIterator›</code></p>
     <p><code> priority_queue(InputIterator first, InputIterator last,</code></p>
     <p><code> const Compare&amp; õ = Compare()): c(first, last), comp(x) {make_heap(c.begin(), ñ.end(), comp);}</code></p>
     <p><code> bool empty() const {return c.empty();}</code></p>
     <p><code> size_type size() const {return c.size();}</code></p>
     <p><code> const value_type&amp; top() const {return c.front();}</code></p>
     <p><code> void push(const value_type&amp; õ) {</code></p>
     <p><code>  c.push_back(õ);</code></p>
     <p><code>  push_heap(c.begin(), c.end(), comp);</code></p>
     <p><code> }</code></p>
     <p><code> void pop() {</code></p>
     <p><code>  pop_heap(c.begin(), c.end(), comp);</code></p>
     <p><code>  ñ.ðîð_bàñk();</code></p>
     <p><code> }</code></p>
     <p><code>}; // Íèêàêîå ðàâåíñòâî íå îáåñïå÷èâàåòñÿ</code></p>
    </section>
   </section>
   <section>
    <title>
     <p>Àäàïòåðû èòåðàòîðîâ (Iterator adaptors)</p>
    </title>
    <section>
     <title>
      <p>Îáðàòíûå èòåðàòîðû (Reverse iterators)</p>
     </title>
     <p>Äâóíàïðàâëåííûå èòåðàòîðû è èòåðàòîðû ïðîèçâîëüíîãî äîñòóïà èìåþò ñîîòâåòñòâóþùèå àäàïòåðû îáðàòíûõ èòåðàòîðîâ, êîòîðûå âûïîëíÿþò èòåðàöèè ÷åðåç ñòðóêòóðó äàííûõ â ïðîòèâîïîëîæíîì íàïðàâëåíèè.Îíè èìåþò òå æå ñàìûå ñèãíàòóðû, êàê è ñîîòâåòñòâóþùèå èòåðàòîðû. Ôóíäàìåíòàëüíîå ñîîòíîøåíèå ìåæäó îáðàòíûì èòåðàòîðîì è åãî ñîîòâåòñòâóþùèì èòåðàòîðîì i óñòàíîâëåíî òîæäåñòâîì &amp;*(reverse_iterator(i))==&amp;*(i - 1). Ýòî îòîáðàæåíèå ïðîäèêòîâàíî òåì, ÷òî, â òî âðåìÿ êàê ïîñëå êîíöà ìàññèâà âñåãäà åñòü óêàçàòåëü, ìîæåò íå áûòü äîïóñòèìîãî óêàçàòåëÿ ïåðåä íà÷àëîì ìàññèâà.</p>
     <p><code>template ‹class BidirectionalIterator, class T, class Reference = T&amp;, class Distance = ptrdiff_t›</code></p>
     <p><code>class reverse_bidirectionaiIterator : public bidirectional_iterator‹T, Distance› {</code></p>
     <p><code> typedef reverse_bidirectional_iterator‹BidirectionalIterator, T, Reference, Distance› self;</code></p>
     <p><code> friend bool operator==(const self&amp; õ, const self&amp; y);</code></p>
     <p><code>protected:</code></p>
     <p><code> BidirectionalIterator current;</code></p>
     <p><code>public:</code></p>
     <p><code> reverse_bidirectional_iterator() {}</code></p>
     <p><code> reverse_bidirectional_iterator(BidirectionalIterator õ) : current(õ) {}</code></p>
     <p><code> BidirectionalIterator base() {return current;}</code></p>
     <p><code> Reference operator*() const {</code></p>
     <p><code>  BidirectionalIterator tmp = current;</code></p>
     <p><code>  return *--tmp;</code></p>
     <p><code> }</code></p>
     <p><code> self&amp; operator++() {</code></p>
     <p><code>  --current;</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> self operator++(int) {</code></p>
     <p><code>  self tmp = *this;</code></p>
     <p><code>  --current;</code></p>
     <p><code>  return tmp;</code></p>
     <p><code> }</code></p>
     <p><code> self&amp; operator--() {</code></p>
     <p><code>  ++current;</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> self operator--(int) {</code></p>
     <p><code>  self tmp = *this;</code></p>
     <p><code>  ++current;</code></p>
     <p><code>  return tmp;</code></p>
     <p><code> }</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class BidirectionalIterator, class T, class Reference, class Distance›</code></p>
     <p><code>inline bool operator==(const reverse_bidirectional_iterator‹BidirectionalIterator, T, Reference, Distance›&amp; x, const reverse_bidirectional_iterator‹BidirectionalIterator,</code></p>
     <p><code>T, Reference, Distance›&amp; y) {</code></p>
     <p><code> return x.current==y.current;</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class T, class Reference = T&amp;, class Distance = ptrdiff_t›</code></p>
     <p><code>class reverse_iterator: public random_access_iterator‹T, Distance› {</code></p>
     <p><code> typedef reverse_iterator‹RandomAccessIterator, T, Reference, Distance› self;</code></p>
     <p><code> friend bool operator==(const self&amp; x, const self&amp; y);</code></p>
     <p><code> friend bool operator‹(const self&amp; x, const self&amp; y);</code></p>
     <p><code> friend Distance operator-(const self&amp; x, const self&amp; y);</code></p>
     <p><code> friend self operator+(Distance n, const self&amp; x);</code></p>
     <p><code>protected:</code></p>
     <p><code> RandomAccessIterator current;</code></p>
     <p><code>public:</code></p>
     <p><code> reverse_iterator() {}</code></p>
     <p><code> reverse_iterator(RandomAccessIterator x): current (x) {}</code></p>
     <p><code> RandomAccessIterator base() {return current;}</code></p>
     <p><code> Reference operator*() const {</code></p>
     <p><code>  RandomAccessIterator tmp = current;</code></p>
     <p><code>  return *--tmp;</code></p>
     <p><code> }</code></p>
     <p><code> self&amp; operator++() {</code></p>
     <p><code>  --current;</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> self operator++(int) {</code></p>
     <p><code>  self tmp = *this;</code></p>
     <p><code>  --current;</code></p>
     <p><code>  return tmp; </code></p>
     <p><code> }</code></p>
     <p><code> self&amp; operator--() {</code></p>
     <p><code>  ++current;</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> self operator--(int) {</code></p>
     <p><code>  self tmp = *this;</code></p>
     <p><code>  ++current;</code></p>
     <p><code>  return tmp;</code></p>
     <p><code> }</code></p>
     <p><code> self operator+(Distance n) const {</code></p>
     <p><code>  return self(current - n);</code></p>
     <p><code> }</code></p>
     <p><code> self&amp; operator+=(Distance n) {</code></p>
     <p><code>  current -= n;</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> self operator-(Distance n) const {</code></p>
     <p><code>  return self(current + n);</code></p>
     <p><code> }</code></p>
     <p><code> self operator-=(Distance n) {</code></p>
     <p><code>  current += n;</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> Reference operator[](Distance n) {return *(*this + n);}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class T, class Reference, class Distance›</code></p>
     <p><code>inline bool operator==(const reverse_iterator‹RandomAccessIterator, T, Reference, Distance›&amp; x, const reverse_iterator‹RandomAccessIterator, T, Reference, Distance›&amp; y) {</code></p>
     <p><code> return x.current == y.current;</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class T, class Reference, class Distance›</code></p>
     <p><code>inline bool operator‹(const reverse_iterator‹RandomAccessIterator, T, Reference, Distance›&amp; x, const reverse_iterator‹RandomAccessIterator, T, Reference, Distance›&amp; y) {</code></p>
     <p><code> return y.current ‹ x.current;</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class T, class Reference, class Distance›</code></p>
     <p><code>inline Distance operator-(const reverse_iterator‹RandomAccessIterator, T, Reference, Distance›&amp; õ, const reverse_iterator‹RandomAccessIterator, T, Reference, Distance›&amp; y) {</code></p>
     <p><code> return y.current - x.current;</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class RandomAccessIterator, class T, class Reference, class Distance›</code></p>
     <p><code>inline reverse_iterator‹RandomAccessIterator, T, Reference, Distance› operator+(Distance n, const reverse_iterator‹RandomAccessIterator, T, Reference, Distance›&amp; x) {</code></p>
     <p><code> return reverse_iterator‹RandomAccessIterator, T, Reference, Distance›(x.current - n);</code></p>
     <p><code>}</code></p>
    </section>
    <section>
     <title>
      <p>Èòåðàòîðû âñòàâêè (Insert iterators)</p>
     </title>
     <p>×òîáû áûëî âîçìîæíî èìåòü äåëî ñ âñòàâêîé òàêèì æå îáðàçîì, êàê ñ çàïèñüþ â ìàññèâ, â áèáëèîòåêå îáåñïå÷èâàåòñÿ ñïåöèàëüíûé âèä àäàïòåðîâ èòåðàòîðîâ, íàçûâàåìûõ <emphasis>èòåðàòîðàìè âñòàâêè</emphasis> (<emphasis>insert iterators</emphasis>). Ñ îáû÷íûìè êëàññàìè èòåðàòîðîâ</p>
     <p><code>while (first!= last) *result++ = *first++;</code></p>
     <p>âûçûâàåò êîïèðîâàíèå äèàïàçîíà [first, last) â äèàïàçîí, íà÷èíàþùèéñÿ ñ result. Òîò æå ñàìûé êîä ñ result, ÿâëÿþùèìñÿ èòåðàòîðîì âñòàâêè, âñòàâèò ñîîòâåòñòâóþùèå ýëåìåíòû â êîíòåéíåð. Òàêîé ìåõàíèçì ïîçâîëÿåò âñåì àëãîðèòìàì êîïèðîâàíèÿ â áèáëèîòåêå ðàáîòàòü â <emphasis>ðåæèìå âñòàâêè</emphasis> (<emphasis>insert mode</emphasis>) âìåñòî îáû÷íîãî ðåæèìà íàëîæåíèÿ çàïèñåé.</p>
     <p>Èòåðàòîð âñòàâêè ñîçäà¸òñÿ èç êîíòåéíåðà è, âîçìîæíî, îäíîãî èç åãî èòåðàòîðîâ, óêàçûâàþùèõ, ãäå âñòàâêà ïðîèñõîäèò, åñëè ýòî íè â íà÷àëå, íè â êîíöå êîíòåéíåðà. Èòåðàòîðû âñòàâêè óäîâëåòâîðÿþò òðåáîâàíèÿì èòåðàòîðîâ âûâîäà. operator* âîçâðàùàåò íåïîñðåäñòâåííî ñàì èòåðàòîð âñòàâêè. Ïðèñâàèâàíèå operator=(const T&amp; õ) îïðåäåëåíî äëÿ èòåðàòîðîâ âñòàâêè, ÷òîáû ðàçðåøèòü çàïèñü â íèõ, îíî âñòàâëÿåò õ ïðÿìî ïåðåä ïîçèöèåé, êóäà èòåðàòîð âñòàâêè óêàçûâàåò. Äðóãèìè ñëîâàìè, èòåðàòîð âñòàâêè ïîäîáåí êóðñîðó, óêàçûâàþùåìó â êîíòåéíåð, ãäå ïðîèñõîäèò âñòàâêà. back_insert_iterator âñòàâëÿåò ýëåìåíòû â êîíöå êîíòåéíåðà, front_insert_iterator âñòàâëÿåò ýëåìåíòû â íà÷àëå êîíòåéíåðà, à insert_iterator âñòàâëÿåò ýëåìåíòû, êóäà èòåðàòîð óêàçûâàåò â êîíòåéíåðå. back_inserter, front_inserter è inserter - òðè ôóíêöèè, ñîçäàþùèå èòåðàòîðû âñòàâêè èç êîíòåéíåðà.</p>
     <p><code>template ‹class Container›</code></p>
     <p><code>class back_insert_iterator: public output_iterator {</code></p>
     <p><code>protected:</code></p>
     <p><code> Container&amp; container;</code></p>
     <p><code>public:</code></p>
     <p><code> back_insert_iterator(Container&amp; x): container(x) {}</code></p>
     <p><code> back_insert_iterator ‹Container›&amp;  operator=(const Container::value_type&amp; value) {</code></p>
     <p><code>  container.push_back(value);</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> back_insert_iterator‹Container›&amp; operator*() {return *this;}</code></p>
     <p><code> back_insert_iterator‹Container›&amp; operator++() {return *this;}</code></p>
     <p><code> back_insert_iterator‹Container›&amp; operator++(int) {return *this;}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>back_insert_iterator‹Container› back_inserter(Container&amp; x) {</code></p>
     <p><code> return back_insert_iterator‹Container›(x);</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>class front_insert_iterator: public output_iterator {</code></p>
     <p><code>protected:</code></p>
     <p><code> Container&amp; container;</code></p>
     <p><code>public:</code></p>
     <p><code> front_insert_iterator(Container&amp; x): container (x) {}</code></p>
     <p><code> front_insert_iterator‹Container›&amp; operator=(const Container::value_type&amp; value) {</code></p>
     <p><code>  container.push_front(value);</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> front_insert_iterator‹Container›&amp; operator*() {return *this;}</code></p>
     <p><code> front_insert_iterator‹Container›&amp; operator++() {return *this;}</code></p>
     <p><code> front_insert_iterator‹Container›&amp; operator++(int) {return *this;}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>front_insert_iterator‹Container› front_inserter(Container&amp; x) {</code></p>
     <p><code> return front_insert_iterator‹Container›(õ);</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class Container›</code></p>
     <p><code>class insert_iterator: public output_iterator {</code></p>
     <p><code>protected:</code></p>
     <p><code> Container&amp; container;</code></p>
     <p><code> Container::iterator iter;</code></p>
     <p><code>public:</code></p>
     <p><code> insert_iterator(Container&amp; x, Container::iterator i) : container (x), iter(i) {}</code></p>
     <p><code> insert_iterator‹Container›&amp; operator=(const Container::value_type&amp; value) {</code></p>
     <p><code>  iter = container.insert(iter, value);</code></p>
     <p><code>  ++iter;</code></p>
     <p><code>  return *this;</code></p>
     <p><code> }</code></p>
     <p><code> insert_iterator‹Container›&amp; operator*() {return *this;}</code></p>
     <p><code> insert_iterator‹Container›&amp; operator++() {return *this;}</code></p>
     <p><code> insert_iterator‹Container›&amp; operator++(int) {return *this;}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Container, class Iterator›</code></p>
     <p><code>insert_iterator&lt;Container› inserter(Container&amp; x, Iterator i) {</code></p>
     <p><code> return insert_iterator‹Container›(x, Container::iterator(i));</code></p>
     <p><code>}</code></p>
    </section>
   </section>
   <section>
    <title>
     <p>Àäàïòåðû ôóíêöèé (Function adaptors)</p>
    </title>
    <section>
     <p>Ôóíêöèîíàëüíûå àäàïòåðû ðàáîòàþò òîëüêî ñ êëàññàìè ôóíêöèîíàëüíûõ îáúåêòîâ ñ îïðåäåë¸ííûìè òèïàìè ïàðàìåòðîâ è òèïîì ðåçóëüòàòà.</p>
    </section>
    <section>
     <title>
      <p>Îòðèöàòåëè (Negators)</p>
     </title>
     <p>Îòðèöàòåëè not1 è not2 áåðóò óíàðíûé è áèíàðíûé ïðåäèêàòû ñîîòâåòñòâåííî è âîçâðàùàþò èõ äîïîëíåíèÿ.</p>
     <p><code>template ‹class Predicate›</code></p>
     <p><code>class unary_negate: public unary_function‹Predicate::argument_type, bool› {</code></p>
     <p><code>protected:</code></p>
     <p><code> Predicate pred;</code></p>
     <p><code>public:</code></p>
     <p><code> unary_negate(const Predicate&amp; x): pred(x) {}</code></p>
     <p><code> bool operator()(const argument_type&amp; x) const {return !pred(x);}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Predicate›</code></p>
     <p><code>unary_negate‹Predicate› not1(const Predicate&amp; pred) {</code></p>
     <p><code> return unary_negate‹Predicate›(pred);</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class Predicate›</code></p>
     <p><code>class binary_negate: public binary_function‹Predicate::first_argument_type, Predicate::second_argument_type, bool› {</code></p>
     <p><code>protected:</code></p>
     <p><code> Predicate pred;</code></p>
     <p><code>public:</code></p>
     <p><code> binary_negate(const Predicate&amp; x): pred(x) {}</code></p>
     <p><code> bool operator()(const first_argument_type&amp; x, const second_argument_type&amp; y) const {</code></p>
     <p><code>  return !pred(x, y);</code></p>
     <p><code> }</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Predicate›</code></p>
     <p><code>binary_negate‹Predicate› not2(const Predicate&amp; pred) {</code></p>
     <p><code> return binary_negate‹Predicate›(pred);</code></p>
     <p><code>}</code></p>
    </section>
    <section>
     <title>
      <p>Ïðèâÿçêè (Binders)</p>
     </title>
     <p>Ïðèâÿçêè bind1st è bind2nd áåðóò ôóíêöèîíàëüíûé îáúåêò f äâóõ ïàðàìåòðîâ è çíà÷åíèå x è âîçâðàùàþò ôóíêöèîíàëüíûé îáúåêò îäíîãî ïàðàìåòðà, ñîçäàííûé èç f ñ ïåðâûì èëè âòîðûì ïàðàìåòðîì ñîîòâåòñòâåííî, ñâÿçàííûì ñ õ.</p>
     <p><code>template ‹class Predicate›</code></p>
     <p><code>class binder1st: public unary_function {</code></p>
     <p><code>protected:</code></p>
     <p><code> Operation op;</code></p>
     <p><code> Operation::first_argument_type value;</code></p>
     <p><code>public:</code></p>
     <p><code> binder1st(const Operation&amp; x, const Operation::first_argument_type&amp; y) : op(x), value(y) {}</code></p>
     <p><code> result_type operator()(const argument_type&amp; x) const {</code></p>
     <p><code>  return op(value, x);</code></p>
     <p><code> }</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Operation, class T›</code></p>
     <p><code>binder1st‹Operation› bind1st(const Operation&amp; op, const T&amp; x) {</code></p>
     <p><code> return binder1st‹Operation›(op, Operation::first_argument_type(x));</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template ‹class Operation›</code></p>
     <p><code>class binder2nd: public unary_function‹0peration::first_argument_type, Operation::result_type› {</code></p>
     <p><code>protected:</code></p>
     <p><code> Operation op;</code></p>
     <p><code> Operation::second_argument_type value;</code></p>
     <p><code>public:</code></p>
     <p><code> binder2nd(const Operation&amp; x, const Operation::second_argument_type&amp; y) : op(x), value(y) {}</code></p>
     <p><code> result_type operator()(const argument_type&amp; x) const {</code></p>
     <p><code>  return op(x, value);</code></p>
     <p><code> }</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Operation, class T›</code></p>
     <p><code>binder2nd‹Operation› bind2nd(const Operation&amp; op, const T&amp; x) {</code></p>
     <p><code> return binder2nd‹0peration›(op, Operation::second_argument_type(x));</code></p>
     <p><code>}</code></p>
     <p>Íàïðèìåð, find_if(v.begin(), v.end(), bind2nd(greater‹int›(), 5)) íàõîäèò ïåðâîå öåëîå ÷èñëî â âåêòîðå v áîëüøåå, ÷åì 5; find_if(v.begin(), v.end(), bind1st(greater‹int›(), 5)) íàõîäèò ïåðâîå öåëîå ÷èñëî â v ìåíüøåå, ÷åì 5.</p>
    </section>
    <section>
     <title>
      <p>Àäàïòåðû óêàçàòåëåé íà ôóíêöèè (Adaptors for pointers to functions)</p>
     </title>
     <p>×òîáû ïîçâîëèòü óêàçàòåëÿì íà (óíàðíûå è áèíàðíûå) ôóíêöèè ðàáîòàòü ñ ôóíêöèîíàëüíûìè àäàïòåðàìè, áèáëèîòåêà îáåñïå÷èâàåò ñëåäóþùåå:</p>
     <p><code>template ‹class Arg, class Result›</code></p>
     <p><code>class pointer_to_unary_function: public unary_function‹Arg, Result› {</code></p>
     <p><code>protected:</code></p>
     <p><code> Result (*ptr)(Arg);</code></p>
     <p><code>public:</code></p>
     <p><code> pointer_to_unary_function() {}</code></p>
     <p><code> pointer_to_unary_function(Result (*x)(Arg)): ptr(x) {}</code></p>
     <p><code> Result operator()(Arg x) const {return ptr(x);}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Arg, class Result›</code></p>
     <p><code>pointer_to_unary_function‹Arg, Result› ptr_fun(Result (*x)(Arg)) {</code></p>
     <p><code> return pointer_to_unary_function‹Arg, Result›(x);</code></p>
     <p><code>}</code></p>
     <empty-line/>
     <p><code>template</code></p>
     <p><code>class pointer_to_binary_function: public binary_function {</code></p>
     <p><code>protected:</code></p>
     <p><code> Result (*ptr)(Arg1, Arg2);</code></p>
     <p><code>public:</code></p>
     <p><code> pointer_to_binary_function() {}</code></p>
     <p><code> pointer_to_binary_function(Result (*x)(Arg1, Arg2)): ptr(õ) {}</code></p>
     <p><code> Result operator()(Arg1 x, Arg2 y) const {return ptr(x, y);}</code></p>
     <p><code>};</code></p>
     <empty-line/>
     <p><code>template ‹class Arg1, class Arg2, class Result›</code></p>
     <p><code>pointer_to_binary_function‹Arg1, Arg2, Result› ptr_fun(Result (*x)(Arg1, Arg2)) {</code></p>
     <p><code> return pointer_to_binary_function‹Argl, Arg2, Result›(x);</code></p>
     <p><code>}</code></p>
     <p>Íàïðèìåð, replace_if(v.begin(), v.end(), not1(bind2nd(ptr_fun(strcmp), "C")), "C++") çàìåíÿåò âñå "Ñ" íà "C++" â ïîñëåäîâàòåëüíîñòè v.</p>
     <p>Ñèñòåìû òðàíñëÿöèè, êîòîðûå èìåþò ìíîæåñòâåííûé óêàçàòåëü íà òèïû ôóíêöèé, äîëæíû îáåñïå÷èòü äîïîëíèòåëüíûå øàáëîíû ôóíêöèé ptr_fun.</p>
    </section>
   </section>
  </section>
  <section>
   <title>
    <p>Ïðèìèòèâû óïðàâëåíèÿ ïàìÿòüþ (Memory Handling Primitives)</p>
   </title>
   <p>×òîáû ïîëó÷àòü òèïè÷íûé óêàçàòåëü íà íåèíèöèàëèçèðîâàííûé áóôåð ïàìÿòè äàííîãî ðàçìåðà, îïðåäåëåíà ñëåäóþùàÿ ôóíêöèÿ:</p>
   <p><code>template ‹class T›</code></p>
   <p><code>inline T* allocate(ptrdiff_t n, Ò*); // n ›= 0</code></p>
   <p>Ðàçìåð (â áàéòàõ) ðàñïðåäåë¸ííîãî áóôåðà - íå ìåíüøå n*sizeof(T).</p>
   <p>Äëÿ êàæäîé ìîäåëè ïàìÿòè èìååòñÿ ñîîòâåòñòâóþùèé øàáëîí ôóíêöèè allocate, îïðåäåë¸ííûé ñ òèïîì ïåðâîãî ïàðàìåòðà, ÿâëÿþùèìñÿ òèïîì ðàññòîÿíèÿ óêàçàòåëåé â ìîäåëè ïàìÿòè.</p>
   <p>Íàïðèìåð, åñëè ñèñòåìà òðàíñëÿöèè ïîääåðæèâàåò _huge óêàçàòåëè ñ òèïîì ðàññòîÿíèÿ long long, îáåñïå÷èâàåòñÿ ñëåäóþùàÿ øàáëîííàÿ ôóíêöèÿ:</p>
   <p><code>template ‹class T›</code></p>
   <p><code>inline T _huge* allocate(long long n, T _huge *);</code></p>
   <p>Òàêæå îáåñïå÷èâàþòñÿ ñëåäóþùèå ôóíêöèè:</p>
   <p><code>template ‹class T›</code></p>
   <p><code>inline void deallocate(T* buffer);</code></p>
   <empty-line/>
   <p><code>template ‹class T1, class T2›</code></p>
   <p><code>inline void construct(T1* p, const T2&amp; value) {new (p) T1(value);}</code></p>
   <empty-line/>
   <p><code>template ‹class T›</code></p>
   <p><code>inline void destroy(T* pointer) {pointer-›~T();}</code></p>
   <p>deallocate îñâîáîæäàåò áóôåð, âûäåëåííûé allocate. Äëÿ êàæäîé ìîäåëè ïàìÿòè èìåþòñÿ ñîîòâåòñòâóþùèå øàáëîíû ôóíêöèé deallocate, construct è destroy, îïðåäåë¸ííûå ñ òèïîì ïåðâîãî ïàðàìåòðà, ÿâëÿþùèìñÿ òèïîì óêàçàòåëÿ â ìîäåëè ïàìÿòè.</p>
   <p><code>template ‹class T›</code></p>
   <p><code>pair‹T*, ptrdiff_t› get_temporary_buffer(ptrdiff_t n, T*);</code></p>
   <empty-line/>
   <p><code>template ‹class T›</code></p>
   <p><code>void return_temporary_buffer(T* p);</code></p>
   <p>get_temporary_buffer èùåò íàèáîëüøèé áóôåð, íå áîëüøå ÷åì n*sizeof(T), è âîçâðàùàåò ïàðó, ñîñòîÿùóþ èç àäðåñà è ðàçìåðà (â åäèíèöàõ sizeof(T)) áóôåðà. return_temporary_buffer âîçâðàùàåò áóôåð, âûäåëåííûé get_temporary_buffer.</p>
  </section>
  <section>
   <title>
    <p>ÏÐÈÌÅÐÛ ÏÐÎÃÐÀÌÌ Ñ ØÀÁËÎÍÀÌÈ</p>
   </title>
   <section>
    <p>Ýòè ïðèìåðû äåìîíñòðèðóþò èñïîëüçîâàíèå íîâîãî ïðîäóêòà STL ‹ToolKit› îò êîìïàíèè ObjectSpace. STL ‹ToolKit› - ýòî ñàìûé ïðîñòîé ñïîñîá èñïîëüçîâàíèÿ STL, êîòîðûé ðàáîòàåò íà áîëüøèíñòâå êîìáèíàöèé ïëàòôîðì/êîìïèëÿòîðîâ, âêëþ÷àÿ cfront, Borland, Visual C++, Set C++, ObjectCenter è ïîñëåäíèå êîìïèëÿòîðû îò Sun&amp;HP.</p>
   </section>
   <section>
    <title>
     <p>accum1.cpp</p>
    </title>
    <p><code>#include ‹ospace/stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(5);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i + 1;</code></p>
    <p><code> int sum = accumulate(v.begin(), v.end(), 0);</code></p>
    <p><code> cout ‹‹ "sum = " ‹‹ sum ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>accum2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int mult(int initial_, int element_) {</code></p>
    <p><code> return initial_ * element_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(5);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i + 1;</code></p>
    <p><code> int prod = accumulate(v.begin(), v.end(), 1, mult);</code></p>
    <p><code> cout ‹‹ "prod = " ‹‹ prod ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>search2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_equal(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) == 0 ? 1:0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* grades[] = {"A", "B", "C", "D", "F"};</code></p>
    <p><code>char* letters[] = {"Q", "E", "D"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned gradeCount = sizeof(grades) / sizeof(grades[0]);</code></p>
    <p><code> const unsigned letterCount = sizeof(letters) / sizeof(letters[0]);</code></p>
    <p><code> ostream_iterator ‹char*› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "grades: ";</code></p>
    <p><code> copy(grades, grades + gradeCount, iter);</code></p>
    <p><code> cout ‹‹ "\nletters:";</code></p>
    <p><code> copy(letters, letters + letterCount, iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <empty-line/>
    <p><code> char** location = search(grades, grades + gradeCount, letters, letters + letterCount, str_equal);</code></p>
    <empty-line/>
    <p><code> if (location == grades + gradeCount) cout ‹‹ "letters not found in grades" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "letters found in grades at offset: " ‹‹ location - grades ‹‹ endl;</code></p>
    <p><code> copy(grades + 1, grades + 1 + letterCount, letters);</code></p>
    <empty-line/>
    <p><code> cout ‹‹ "grades: ";</code></p>
    <p><code> copy(grades, grades + gradeCount, iter);</code></p>
    <p><code> cout ‹‹ "\nletters:";</code></p>
    <p><code> copy(letters, letters + letterCount, iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <empty-line/>
    <p><code> location = search(grades, grades + gradeCount, letters, letters + letterCount, str_equal);</code></p>
    <empty-line/>
    <p><code> if (location == grades + gradeCount) cout ‹‹ "letters not found in grades" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "letters found in grades at offset: " ‹‹ location - grades ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>incl2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool compare_strings(const char* s1_, const char* s2_) {</code></p>
    <p><code> return ::strcmp(s1_, s2_) ‹ 0 ? 1: 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* names[] = {"Todd", "Mike", "Graham", "Jack", "Brett"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned nameSize = sizeof(names)/sizeof(names[0]);</code></p>
    <p><code> vector‹char*› v1(nameSize);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = names[i];</code></p>
    <p><code> }</code></p>
    <p><code> vector‹char*› v2(2);</code></p>
    <p><code> v2[0] = "foo";</code></p>
    <p><code> v2[1] = "bar";</code></p>
    <p><code> sort(v1.begin(), v1.end(), compare_strings);</code></p>
    <p><code> sort(v2.begin(), v2.end(), compare_strings);</code></p>
    <empty-line/>
    <p><code> bool inc = includes(v1.begin(), v1.end(), v2.begin(), v2.end(), compare_strings);</code></p>
    <p><code> if (inc) cout ‹‹ "v1 includes v2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "v1 does not include v2" ‹‹ endl;</code></p>
    <p><code> v2[0] = "Brett";</code></p>
    <p><code> v2[1] = "Todd";</code></p>
    <p><code> inc = includes(v1.begin(), v1.end(), v2.begin(), v2.end(), compare_strings);</code></p>
    <p><code> if (inc) cout ‹‹ "v1 includes v2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "v1 does not include v2" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>search1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef vector‹int› IntVec;</code></p>
    <p><code> IntVec v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> IntVec v2(3);</code></p>
    <p><code> iota(v2.begin(), v2.end(), 50);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <empty-line/>
    <p><code> cout ‹‹ "v1: ";</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "v2: ";</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <empty-line/>
    <p><code> IntVec::iterator location;</code></p>
    <p><code> location = search(v1.begin(), v1.end(), v2.begin(), v2.end());</code></p>
    <p><code> if (location == v1.end()) cout ‹‹ "v2 not contained in v1" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Found v2 in v1 at offset: " ‹‹ location - v1.begin() ‹‹ endl;</code></p>
    <empty-line/>
    <p><code> iota(v2.begin(), v2.end(), 4);</code></p>
    <p><code> cout ‹‹ "v1: ";</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "v2: ";</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <empty-line/>
    <p><code> location = search(v1.begin(), v1.end(), v2.begin(), v2.end());</code></p>
    <p><code> if (location == v1.end()) cout ‹‹ "v2 not contained in v1" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Found v2 in v1 at offset: " ‹‹ location - v1.begin() ‹‹ endl;</code></p>
    <empty-line/>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>istmit2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹fstream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>typedef vector‹char› Line;</code></p>
    <p><code>void printLine(const Line* line_)  {</code></p>
    <p><code> vector‹char›::const_iterator i;</code></p>
    <p><code> for (i = line_-›begin(); i!= line_-›end(); i++) cout ‹‹ *i;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> Line buffer;</code></p>
    <p><code> vector‹Line*› lines;</code></p>
    <p><code> ifstream s("data.txt");</code></p>
    <p><code> s.unsetf(ios::skipws); // Disable white-space skipping.</code></p>
    <p><code> istream_iterator‹char, ptrdiff_t› it1(s); // Position at start of file.</code></p>
    <p><code> istream_iterator‹char, ptrdiff_t› it2; // Serves as "past-the-end" marker.</code></p>
    <p><code> copy(it1, it2, back_inserter(buffer));</code></p>
    <p><code> Line::iterator i = buffer.begin();</code></p>
    <p><code> Line::iterator p;</code></p>
    <p><code> while (i != buffer.end()) {</code></p>
    <p><code>  p = find(i, buffer.end(), '\n');</code></p>
    <p><code>  lines.push_back(new Line(i, p));</code></p>
    <p><code>  i = ++p;</code></p>
    <p><code> }</code></p>
    <p><code> sort(lines.begin(), lines.end(), less_p‹Line*›());</code></p>
    <p><code> cout ‹‹ "Read " ‹‹ lines.size() ‹‹ " lines" ‹‹ endl;</code></p>
    <p><code> vector‹Line*›::iterator j;</code></p>
    <p><code> for(j = lines.begin(); j!= lines.end(); j++) printLine(*j);</code></p>
    <p><code> release(lines.begin(), lines.end()); // Release memory.</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>alloc1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹ospace/stl/examples/myaloc.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> {</code></p>
    <p><code>  cout ‹‹ "vectors:" ‹‹ endl;</code></p>
    <p><code>  os_my_allocator‹int› alloc;</code></p>
    <p><code>  vector‹int› v3(alloc);</code></p>
    <p><code>  v3.push_back(42);</code></p>
    <p><code>  vector‹int› v4(alloc);</code></p>
    <p><code>  v4.push_back(42);</code></p>
    <p><code> }</code></p>
    <p><code> {</code></p>
    <p><code>  cout ‹‹ "bit_vectors:" ‹‹ endl;</code></p>
    <p><code>  os_my_allocator‹unsigned int› alloc;</code></p>
    <p><code>  bit_vector v1(alloc);</code></p>
    <p><code>  v1.push_back(1);</code></p>
    <p><code> }</code></p>
    <p><code> {</code></p>
    <p><code>  cout ‹‹ "deques:" ‹‹ endl;</code></p>
    <p><code>  os_my_allocator‹int› alloc;</code></p>
    <p><code>  deque‹int› d(alloc);</code></p>
    <p><code>  d.push_back(42);</code></p>
    <p><code> }</code></p>
    <p><code> {</code></p>
    <p><code>  cout ‹‹ "lists:" ‹‹ endl;</code></p>
    <p><code>  os_my_allocator‹os_list_node‹int› › alloc;</code></p>
    <p><code>  list‹int› l(alloc);</code></p>
    <p><code>  l.push_back(42);</code></p>
    <p><code> }</code></p>
    <p><code> {</code></p>
    <p><code>  cout ‹‹ "sets:" ‹‹ endl;</code></p>
    <p><code>  os_my_allocator‹os_value_node‹int› › alloc;</code></p>
    <p><code>  set‹int, less‹int› › s(alloc);</code></p>
    <p><code>  s.insert(42);</code></p>
    <p><code> }</code></p>
    <p><code> {</code></p>
    <p><code>  cout ‹‹ "maps" ‹‹ endl;</code></p>
    <p><code>  os_my_allocator‹os_value_node‹os_pair‹const int, float› › › alloc;</code></p>
    <p><code>  map‹int, float, less‹int› › m(alloc);</code></p>
    <p><code>  m[4] = 2.0;</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>release2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>class X {</code></p>
    <p><code>public:</code></p>
    <p><code> X(int i_): i (i_) {}</code></p>
    <p><code> ~X() {cout ‹‹ "Delete X(" ‹‹ i ‹‹ ")" ‹‹ endl;}</code></p>
    <p><code> int i;</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>ostream&amp; operator ‹‹ (ostream&amp; stream_, const X&amp; x_) {</code></p>
    <p><code> return stream_ ‹‹ "X(" ‹‹ x_.i ‹‹ ")";</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹X*› v;</code></p>
    <p><code> v.push_back(new X(2));</code></p>
    <p><code> v.push_back(new X(1));</code></p>
    <p><code> v.push_back(new X(4));</code></p>
    <p><code> vector‹X*›::iterator i;</code></p>
    <p><code> cout ‹‹ "Initial contents:" ‹‹ endl;</code></p>
    <p><code> for (i = v.begin(); i!= v.end(); i++) cout ‹‹ " " ‹‹ *(*i) ‹‹ endl;</code></p>
    <p><code> release(v.begin()); // Delete the first heap-based object.</code></p>
    <p><code> v.erase(v.begin()); // Erase the first element.</code></p>
    <p><code> cout ‹‹ "Remaining contents:" ‹‹ endl;</code></p>
    <p><code> for (i = v.begin(); i != v.end(); i++) cout ‹‹ " " ‹‹ *(*i) ‹‹ endl;</code></p>
    <p><code> release(v.begin(), v.end()); // Delete remaining heap-based objects.</code></p>
    <p><code> v.erase(v.begin(), v.end()); // Erase remaining elements.</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>map1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef map‹char, int, less‹char› › maptype;</code></p>
    <p><code> maptype m;</code></p>
    <p><code> // Store mappings between roman numerals and decimals.</code></p>
    <p><code> m['l'] = 50;</code></p>
    <p><code> m['x'] = 20; // Deliberate mistake.</code></p>
    <p><code> m['v'] = 5;</code></p>
    <p><code> m['i'] = 1;</code></p>
    <p><code> cout ‹‹ "m['x'] = " ‹‹ m['x'] ‹‹ endl;</code></p>
    <p><code> m['x'] = 10; // Correct mistake.</code></p>
    <p><code> cout ‹‹ "m['x'] = " ‹‹ m['x'] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "m['z'] = " ‹‹ m['z'] ‹‹ endl; // Note default value is added.</code></p>
    <p><code> cout ‹‹ "m.count('z') = " ‹‹ m.count('z') ‹‹ endl;</code></p>
    <p><code> pair‹maptype::iterator, bool› p;</code></p>
    <p><code> p = m.insert(pair‹const char, int›('c', 100));</code></p>
    <p><code> if (p.second) cout ‹‹ "First insertion successful" ‹‹ endl;</code></p>
    <p><code> p = m.insert(pair‹const char, int› ('c', 100));</code></p>
    <p><code> if (p.second) cout ‹‹ "Second insertion successful" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Existing pair " ‹‹ (*(p.first)).first ‹‹ " -› " ‹‹ (*(p.first)).second ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mismtch2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_equal(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) == 0 ? 1: 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>const unsigned size = 5;</code></p>
    <p><code>char* n1[size] = {"Brett", "Graham", "Jack", "Mike", "Todd"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> char* n2[size];</code></p>
    <p><code> copy(n1, n1 + 5, n2);</code></p>
    <p><code> pair‹char**, char**› result;</code></p>
    <p><code> result = mismatch(n1, n1+ size, n2, str_equal);</code></p>
    <p><code> if (result.first == n1 + size &amp;&amp; result.second == n2 + size)</code></p>
    <p><code>  cout ‹‹ "n1 and n2 are the same" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "mismatch at index: " ‹‹ (result.first - n1) ‹‹ endl;</code></p>
    <p><code> n2[2] = "QED";</code></p>
    <p><code> result = mismatch(n1, n1 + size, n2, str_equal);</code></p>
    <p><code> if (result.first == n2 + size &amp;&amp; result.second == n2 + size)</code></p>
    <p><code>  cout ‹‹ "n1 and n2 are the same" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "mismatch at index: " ‹‹ (result.first - n1) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mismtch1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef vector‹int› IntVec;</code></p>
    <p><code> IntVec v1(10);</code></p>
    <p><code> IntVec v2(v1.size());</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> iota(v2.begin(), v2.end(), 0);</code></p>
    <p><code> pair ‹IntVec::iterator, IntVec::iterator› result;</code></p>
    <p><code> result = mismatch(v1.begin(), v1.end(), v2.begin());</code></p>
    <p><code> if (result.first = v1.end() &amp;&amp; result.second == v2.end())</code></p>
    <p><code>  cout ‹‹ "v1 and v2 are the same" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "mismatch at index: " ‹‹ (result.first - v1.begin()) ‹‹ endl;</code></p>
    <p><code> v2[v2.size()/2] = 42;</code></p>
    <p><code> result = mismatch(v1.begin(), v1.end(), v2.begin());</code></p>
    <p><code> if (result.first == v1.end() &amp;&amp; result.second == v2.end())</code></p>
    <p><code>  cout ‹‹ "v1 and v2 are the same" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "mismatch at index: " ‹‹ (result.first - v1.begin()) ‹‹ endl;</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mmap2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>typedef multimap‹int, char, less‹int› › mmap;</code></p>
    <p><code>typedef pair‹const int, char› pair_type;</code></p>
    <empty-line/>
    <p><code>pair_type p1(3, 'c');</code></p>
    <p><code>pair_type p2(6, 'f');</code></p>
    <p><code>pair_type p3(1, 'a');</code></p>
    <p><code>pair_type p4(2, 'b');</code></p>
    <p><code>pair_type p5(3, 'x');</code></p>
    <p><code>pair_type p6(6, 'f');</code></p>
    <empty-line/>
    <p><code>pair_type array[] = { p1, p2, p3, p4, p5, p6 };</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> mmap m(array, array + 7);</code></p>
    <p><code> mmap::iterator i;</code></p>
    <p><code> // Return location of first element that is not less than 3</code></p>
    <p><code> i = m.lower_bound(3);</code></p>
    <p><code> cout ‹‹ "lower bound:" ‹‹ endl;</code></p>
    <p><code> cout ‹‹ (*i).first ‹‹ " -› " ‹‹ (*i).second ‹‹ endl;</code></p>
    <p><code> // Return location of first element that is greater than 3</code></p>
    <p><code> i = m.upper_bound(3);</code></p>
    <p><code> cout ‹‹ "upper bound:" ‹‹ endl;</code></p>
    <p><code> cout ‹‹ (*i).first ‹‹ " -› " ‹‹ (*i).second ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>adjfind2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>typedef vector‹char*› CStrVector;</code></p>
    <empty-line/>
    <p><code>int equal_length(const char* v1_, const char* v2_) {</code></p>
    <p><code> return ::strlen(v1_) == ::strlen(v2_);</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* names[] = {"Brett", "Graham", "Jack", "Mike", "Todd"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const int nameCount = sizeof(names)/sizeof(names[0]);</code></p>
    <p><code> CStrVector v(nameCount);</code></p>
    <p><code> for (int i = 0; i ‹ nameCount; i++) v[i] = names[i];</code></p>
    <p><code> CStrVector::iterator location;</code></p>
    <p><code> location = adjacent_find(v.begin(), v.end(), equal_length);</code></p>
    <p><code> if (location!= v.end())</code></p>
    <p><code>  cout ‹‹ "Found two adjacent strings of equal length: " ‹‹ *location </code></p>
    <p><code>       ‹‹ " -and- " ‹‹ *(location + 1) ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Didn't find two adjacent strings of equal length.";</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>list3.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char array[] = {'x', 'l', 'x', 't', 's', 's'};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> list‹char› str(array, array + 6);</code></p>
    <p><code> list‹char›::iterator i;</code></p>
    <p><code> cout ‹‹ "original: ";</code></p>
    <p><code> for (i = str.begin(); i != str.end(); i++) cout ‹‹ *i;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "reversed: ";</code></p>
    <p><code> str.reverse();</code></p>
    <p><code> for (i = str.begin(); i != str.end(); i++) cout ‹‹ *i;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "removed: ";</code></p>
    <p><code> str.remove('x');</code></p>
    <p><code> for (i = str.begin(); i != str.end(); i++) cout ‹‹ *i;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "uniqued: ";</code></p>
    <p><code> str.unique();</code></p>
    <p><code> for (i = str.begin(); i != str.end(); i++) cout ‹‹ *i;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "sorted: ";</code></p>
    <p><code> str.sort();</code></p>
    <p><code> for (i = str.begin(); i != str.end(); i++) cout ‹‹ *i;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>parsrtc2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_compare(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1: 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* names[] = {"aa", "ff", "dd", "ee", "cc", "bb"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned nameSize = sizeof(names) / sizeof(names[0]);</code></p>
    <p><code> vector‹char*› v1(nameSize);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = names[i];</code></p>
    <p><code> ostream_iterator‹char*› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> vector‹char*› result(5);</code></p>
    <p><code> partial_sort_copy(v1.begin(), v1.end(), result.begin(), result.end(), str_compare);</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec6.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 4, 9, 16, 25, 36};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(array, array + 6);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) cout ‹‹ "v[" ‹‹ i ‹‹ "] = " ‹‹ v[i] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> v.erase(v.begin()); // Erase first element.</code></p>
    <p><code> for (i = 0; i ‹ v.size(); i++) cout ‹‹ "v[" ‹‹ i ‹‹ "] = " ‹‹ v[i] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> v.erase(v.end() - 1); // Erase last element.</code></p>
    <p><code> for (i = 0; i ‹ v.size(); i++) cout ‹‹ "v[" ‹‹ i ‹‹ "] = " ‹‹ v[i] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> v.erase(v.begin() + 1, v.end() - 1); // Erase all but first and last.</code></p>
    <p><code> for (i = 0; i ‹ v.size(); i++)</code></p>
    <p><code> cout ‹‹ "v[" ‹‹ i ‹‹ "] = " ‹‹ v[i] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> v.erase(); // Erase all.</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>inrprod2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>int add(int a_, int b_) {</code></p>
    <p><code> return a_ + b_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int mult(int a_, int b_) {</code></p>
    <p><code> return a_ * b_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(3);</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = i + 1;</code></p>
    <p><code>  v2[i] = v1.size() - i;</code></p>
    <p><code> }</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "Inner product(product of sums):\n\t";</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ "\n\t";</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> int result = inner_product(v1.begin(), v1.end(), v2.begin(), 1, mult, add);</code></p>
    <p><code> cout ‹‹ "\nis: " ‹‹ result ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mmap1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef multimap‹char, int, less‹char› › mmap;</code></p>
    <p><code> mmap m;</code></p>
    <p><code> cout ‹‹ "count('X') = " ‹‹ m.count('X') ‹‹ endl;</code></p>
    <p><code> m.insert(pair‹const char, int›('X', 10)); // Standard way.</code></p>
    <p><code> cout ‹‹ "count('X') = " ‹‹ m.count('X') ‹‹ endl;</code></p>
    <p><code> m.insert('X', 20); // Non-standard, but very convenient!</code></p>
    <p><code> cout ‹‹ "count('X') = " ‹‹ m.count('X') ‹‹ endl;</code></p>
    <p><code> m.insert('Y', 32);</code></p>
    <p><code> mmap::iterator i = m.find('X'); // Find first match.</code></p>
    <p><code> while (i != m.end()) { // Loop until end is reached.</code></p>
    <p><code>  cout ‹‹ (*i).first ‹‹ " -› " ‹‹ (*i).second ‹‹ endl;</code></p>
    <p><code>  i++;</code></p>
    <p><code> }</code></p>
    <p><code> int count = m.erase('X');</code></p>
    <p><code> cout ‹‹ "Erased " ‹‹ count ‹‹ " items" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>adjfind0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers1[5] = {1, 2, 4, 8, 16};</code></p>
    <p><code>int numbers2[5] = {5, 3, 2, 1, 1};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* location = adjacent_find(numbers1, numbers1 + 5);</code></p>
    <empty-line/>
    <p><code> if (location != numbers1 + 5)</code></p>
    <p><code>  cout ‹‹ "Found adjacent pair of: " ‹‹ *location ‹‹ " at offset " ‹‹ (location - numbers1) ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "No adjacent pairs" ‹‹ endl;</code></p>
    <p><code> location = adjacent_find(numbers2, numbers2 + 5);</code></p>
    <p><code> if (location != numbers2 + 5)</code></p>
    <p><code>  cout ‹‹ "Found adjacent pair of: " ‹‹ *location ‹‹ " at offset " ‹‹ (location - numbers2) ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "No adjacent pairs" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>parsrt2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_compare(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1: 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* names[] = {"aa", "ff", "dd", "ee", "cc", "bb"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned nameSize = sizeof(names) / sizeof(names[0]);</code></p>
    <p><code> vector‹char*› v1(nameSize);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = names[i];</code></p>
    <p><code> ostream_iterator‹char*› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> partial_sort(v1.begin(), v1.begin() + nameSize/2, v1.end(), str_compare);</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mset5.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool less_than(int a_, int b_) {</code></p>
    <p><code> return a_ ‹ b_;</code></p>
    <p><code>}</code></p>
    <p><code>bool greater_than(int a_, int b_) {</code></p>
    <p><code> return a_ › b_;</code></p>
    <p><code>}</code></p>
    <p><code>int array[] = {3, 6, 1, 9};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef pointer_to_binary_function‹int, int, bool› fn_type;</code></p>
    <p><code> typedef multiset‹int, fn_type› mset;</code></p>
    <p><code> fn_type f(less_than);</code></p>
    <p><code> mset s1(array, array + 4, f);</code></p>
    <p><code> mset::const_iterator i = s1.begin();</code></p>
    <p><code> cout ‹‹ "Using less_than: " ‹‹ endl;</code></p>
    <p><code> while (i != s1.end()) cout ‹‹ *i++ ‹‹ endl;</code></p>
    <p><code> fn_type g(greater_than);</code></p>
    <p><code> mset s2(array, array + 4, g);</code></p>
    <p><code> i = s2.begin();</code></p>
    <p><code> cout ‹‹ "Using greater_than: " ‹‹ endl;</code></p>
    <p><code> while (i != s2.end()) cout ‹‹ *i++ ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mset1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef multiset‹int, less‹int› › mset;</code></p>
    <p><code> mset s;</code></p>
    <p><code> cout ‹‹ "count(42) = " ‹‹ s.count(42) ‹‹ endl;</code></p>
    <p><code> s.insert(42);</code></p>
    <p><code> cout ‹‹ "count(42) = " ‹‹ s.count(42) ‹‹ endl;</code></p>
    <p><code> s.insert(42);</code></p>
    <p><code> cout ‹‹ "count(42) = " ‹‹ s.count(42) ‹‹ endl;</code></p>
    <p><code> set‹int, less‹int› ›::iterator i = s.find(40);</code></p>
    <p><code> if (i == s.end()) cout ‹‹ "40 Not found" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Found " ‹‹ *i ‹‹ endl;</code></p>
    <p><code> i = s.find(42);</code></p>
    <p><code> if (i == s.end()) cout ‹‹ "Not found" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Found " ‹‹ *i ‹‹ endl;</code></p>
    <p><code> int count = s.erase(42);</code></p>
    <p><code> cout ‹‹ "Erased " ‹‹ count ‹‹ " instances" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>void print(vector‹double›&amp; vector_) {</code></p>
    <p><code> for (int i = 0; i ‹ vector_.size(); i++)</code></p>
    <p><code> cout ‹‹ vector_[i] ‹‹ " ";</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹double› v1; // Empty vector of doubles.</code></p>
    <p><code> v1.push_back(32.1);</code></p>
    <p><code> v1.push_back(40.5);</code></p>
    <p><code> vector‹double› v2; // Another empty vector of doubles.</code></p>
    <p><code> v2.push_back(3.56);</code></p>
    <p><code> cout ‹‹ "v1 = ";</code></p>
    <p><code> print(v1);</code></p>
    <p><code> cout ‹‹ "v2 = ";</code></p>
    <p><code> print(v2);</code></p>
    <p><code> v1.swap(v2); // Swap the vector's contents.</code></p>
    <p><code> cout ‹‹ "v1 = ";</code></p>
    <p><code> print(v1);</code></p>
    <p><code> cout ‹‹ "v2 = ";</code></p>
    <p><code> print(v2);</code></p>
    <p><code> v2 = v1; // Assign one vector to another.</code></p>
    <p><code> cout ‹‹ "v2 = ";</code></p>
    <p><code> print(v2);</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>uniqcpy2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_equal(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) - 0 ? 1: 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* labels[] = {"Q","Q","W","W","E","E","R","T","T","Y","Y"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned count = sizeof(labels) / sizeof(labels[0]);</code></p>
    <p><code> ostream_iterator ‹char*› iter(cout);</code></p>
    <p><code> copy(labels, labels + count, iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> char* uCopy[count];</code></p>
    <p><code> fill(uCopy, uCopy + count, ");</code></p>
    <p><code> unique_copy(labels, labels + count, uCopy, str_equal);</code></p>
    <p><code> copy(labels, labels + count, iter);</code></p>
    <p><code>cout ‹‹ endl;</code></p>
    <p><code>copy(uCopy, uCopy + count, iter);</code></p>
    <p><code>cout ‹‹ endl;</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mismtch0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int n1[5] = {1, 2, 3, 4, 5};</code></p>
    <p><code>int n2[5] = {1, 2, 3, 4, 5};</code></p>
    <p><code>int n3[5] = {1, 2, 3, 2, 1};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> pair ‹int*, int*› result;</code></p>
    <p><code> result = mismatch(n1, n1 + 5, n2);</code></p>
    <p><code> if (result.first == (n1 + 5) &amp;&amp; result.second == (n2 + 5))</code></p>
    <p><code>  cout ‹‹ "n1 and n2 are the same" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Mismatch at offset: " ‹‹ (result.first - n1) ‹‹ endl;</code></p>
    <p><code> result = mismatch(n1, n1 + 5, n3);</code></p>
    <p><code> if (result.first == (n1 + 5) &amp;&amp; result.second == (n3 + 5))</code></p>
    <p><code>  cout ‹‹ "n1 and n3 are the same" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Mismatch at offset: " ‹‹ (result.first - n1) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rndshuf2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>class MyRandomGenerator {</code></p>
    <p><code>public:</code></p>
    <p><code> nsigned long operator()(unsigned long n_);</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>unsigned long MyRandomGenerator::operator()(unsigned long n_) {</code></p>
    <p><code> return rand() % n_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> MyRandomGenerator r;</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) {</code></p>
    <p><code>  random_shuffle(v1.begin(), v1.end(), r);</code></p>
    <p><code>  copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code>  cout ‹‹ endl;</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>merge2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(5);</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = 10 - i;</code></p>
    <p><code>  v2[i] = 7 - i;</code></p>
    <p><code> }</code></p>
    <p><code> vector‹int› result(v1.size() + v2.size());</code></p>
    <p><code> merge(v1.begin(), v1.end(), v2.begin(), v2.end(), result.begin(), greater‹int›());</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(result.begin(), result.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>adjfind1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef vector‹int› IntVector;</code></p>
    <p><code> IntVector v(10);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i;</code></p>
    <p><code> IntVector::iterator location;</code></p>
    <p><code> location = adjacent_find(v.begin(), v.end());</code></p>
    <p><code> if (location != v.end()) cout ‹‹ "Found adjacent pair of: " ‹‹ *location ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "No adjacent pairs" ‹‹ endl;</code></p>
    <p><code> v[6] = 7;</code></p>
    <p><code> location = adjacent_find(v.begin(), v.end());</code></p>
    <p><code> if (location!= v.end())  cout ‹‹ "Found adjacent pair of: " ‹‹ *location ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "No adjacent pairs" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec7.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array1[] = {1, 4, 25};</code></p>
    <p><code>int array2[] = {9, 16};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(array1, array1 + 3);</code></p>
    <p><code> v.insert(v.begin(), 0); // Insert before first element.</code></p>
    <p><code> v.insert(v.end(), 36); // Insert after last element.</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) cout ‹‹ "v[" ‹‹ i ‹‹ "] = " ‹‹ v[i] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> // Insert contents of array2 before fourth element.</code></p>
    <p><code> v.insert(v.begin() + 3, array2, array2 + 2);</code></p>
    <p><code> for (i = 0; i ‹ v.size(); i++)</code></p>
    <p><code> cout ‹‹ "v[" ‹‹ i ‹‹ "] = " ‹‹ v[i] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bcompos1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>struct odd: public unary_function‹int, bool› {</code></p>
    <p><code> odd() {}</code></p>
    <p><code> bool operator() (int n_) const {return (n_ % 2) - 1;}</code></p>
    <p><code>};</code></p>
    <p><code>struct positive: public unary_function‹int, bool› {</code></p>
    <p><code> positive() {}</code></p>
    <p><code> bool operator() (int n_) const {return n_ ›= 0;}</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int array[6] = {-2, -1, 0, 1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> binary_compose‹logical_and‹bool›, odd, positive› b(logical_and‹bool›(), odd(), positive());</code></p>
    <p><code> int* p = find_if(array, array + 6, b);</code></p>
    <p><code> if (p != array + 6) cout ‹‹ *p ‹‹ " is odd and positive" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setsymd2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>char* word1 = "ABCDEFGHIJKLMNO";</code></p>
    <p><code>char* word2 = "LMNOPQRSTUVWXYZ";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> ostream_iterator‹char› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "word1: ";</code></p>
    <p><code> copy(word1, word1 + ::strlen(word1), iter);</code></p>
    <p><code> cout ‹‹ "\nword2: ";</code></p>
    <p><code> copy(word2, word2 + ::strlen(word2), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_symmetric_difference(word1, word1 + ::strlen(word1), word2, word2 + ::strlen(word2), iter, less‹char›());</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>search0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int v1[6] = {1, 1, 2, 3, 5, 8};</code></p>
    <p><code>int v2[6] = {0, 1, 2, 3, 4, 5};</code></p>
    <p><code>int v3[2] = {3, 4};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* location;</code></p>
    <p><code> location = search(v1, v1 + 6, v3, v3 + 2);</code></p>
    <p><code> if (location == v1 + 6) cout ‹‹ "v3 not contained in v1" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Found v3 in v1 at offset: " ‹‹ location - v1 ‹‹ endl;</code></p>
    <p><code> location = search(v2, v2 + 6, v3, v3 + 2);</code></p>
    <p><code> if (location == v2 + 6) cout ‹‹ "v3 not contained in v2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Found v3 in v2 at offset: " ‹‹ location - v2 ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>eqlrnge1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef vector‹int› IntVec;</code></p>
    <p><code> IntVec v(10);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i / 3;  ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "Within the collection:\n\t";</code></p>
    <p><code> copy(v.begin(), v.end(), iter);</code></p>
    <p><code> pair‹IntVec::iterator, IntVec::iterator› range;</code></p>
    <p><code> range = equal_range(v.begin(), v.end(), 2);</code></p>
    <p><code> cout ‹‹ "\n2 can be inserted from before index " ‹‹ (range.first - v.begin())</code></p>
    <p><code>      ‹‹ " to before index " ‹‹ (range.second - v.begin()) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rotcopy1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code>vector‹int› v1(10);</code></p>
    <p><code>iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code>ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code>copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code>cout ‹‹ endl;</code></p>
    <p><code>vector‹int› v2(v1.size());</code></p>
    <p><code>for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code> rotate_copy(v1.begin(), v1.begin() + i, v1.end(), v2.begin());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code>}</code></p>
    <p><code>cout ‹‹ endl;</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>eqlrnge2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>char chars[] = "aabbccddggghhklllmqqqqssyyzz";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned count = sizeof(chars) - 1;</code></p>
    <p><code> ostream_iterator‹char› iter(cout);</code></p>
    <p><code> cout ‹‹ "Within the collection:\n\t";</code></p>
    <p><code> copy(chars, chars + count, iter);</code></p>
    <p><code> pair‹char*, char*› range;</code></p>
    <p><code> range = equal_range(chars, chars + count, 'q', less‹char›());</code></p>
    <p><code> cout ‹‹ "\nq can be inserted from before index " ‹‹ (range.first - chars) ‹‹ " to before index "</code></p>
    <p><code>      ‹‹ (range.second - chars) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>release1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>class X {</code></p>
    <p><code>public:</code></p>
    <p><code> X(int i_): i(i_) {}</code></p>
    <p><code> ~X() {cout ‹‹ "Delete X(" ‹‹ i ‹‹ ")" ‹‹ endl;}</code></p>
    <p><code> int i;</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>ostream&amp; operator ‹‹ (ostream&amp; stream_, const X&amp; x_) {</code></p>
    <p><code> return stream_ ‹‹ "X(" ‹‹ x_.i ‹‹ ")";</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹X*› v;</code></p>
    <p><code> v.push_back(new X(2));</code></p>
    <p><code> v.push_back(new X(1));</code></p>
    <p><code> v.push_back(new X(4));</code></p>
    <p><code> vector‹X*›::iterator i;</code></p>
    <p><code> for (i = v.begin(); i!= v.end(); i++) cout ‹‹ *(*i) ‹‹ endl;</code></p>
    <p><code> release(v.begin(), v.end()); // Delete heap-based objects.</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>incl1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> vector‹int› v2(3);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = i;</code></p>
    <p><code> }</code></p>
    <p><code> if (includes(v1.begin(), v1.end(), v2.begin(), v2.end())) cout ‹‹ "v1 includes v2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "v1 does not include v2" ‹‹ endl;</code></p>
    <p><code> for (i = 0; i ‹ v2.size(); i++) v2[i] = i + 3;</code></p>
    <p><code> if (includes(v1.begin(), v1.end(), v2.begin(), v2.end())) cout ‹‹ "v1 includes v2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "v1 does not include v2" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setintr2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>char* word1 = "ABCDEFGHIJKLMNO";</code></p>
    <p><code>char* word2 = "LMNOPQRSTUVWXYZ";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> ostream_iterator ‹char› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "word1: ";</code></p>
    <p><code> copy(word1, word1 + ::strlen(word1), iter);</code></p>
    <p><code> cout ‹‹ "\nword2: ";</code></p>
    <p><code> copy(word2, word2 + ::strlen(word2), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_intersection(word1, word1 + ::strlen(word1), word2, word2 + ::strlen(word2), iter, less‹char›());</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>inrprod1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(3);</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = i + 1;</code></p>
    <p><code>  v2[i] = v1.size() - i;</code></p>
    <p><code> }</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "Inner product(sum of products) of:\n\t";</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ "\n\t";</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> int result = inner_product(v1.begin(), v1.end(), v2.begin(), 0);</code></p>
    <p><code>cout ‹‹ "\nis: " ‹‹ result ‹‹ endl;</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>merge1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(5);</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> iota(v2.begin(), v2.end(), 3);</code></p>
    <p><code> vector‹int› result(v1.size() + v2.size());</code></p>
    <p><code> merge(v1.begin(), v1.end(), v2.begin(), v2.end(), result.begin());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(result.begin(), result.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bcompos2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>struct odd: public unary_function‹int, bool› {</code></p>
    <p><code> odd() {}</code></p>
    <p><code> bool operator() (int n_) const  {return (n_ % 2) - 1;}</code></p>
    <p><code>};</code></p>
    <p><code>struct positive: public unary_function‹int, bool› {</code></p>
    <p><code> positive() {}</code></p>
    <p><code> bool operator() (int n_) const  {return n_ ›= 0;}</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int array[6] = {-2, -1, 0, 1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* p = find_if(array, array + 6, compose2(logical_and‹bool›(), odd(), positive()));</code></p>
    <p><code> if (p != array + 6) cout ‹‹ *p ‹‹ " is odd and positive" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>error3.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>// Compile this code without defining OS_USE_EXCEPTIONS.</code></p>
    <p><code>void my_handler(int code_, const char* str_) {</code></p>
    <p><code> cout ‹‹ "Caught " ‹‹ str_ ‹‹ "[code " ‹‹ code_ ‹‹ "]" ‹‹ endl;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> os_handler_function_t old_h = os_set_error_handler(my_handler);</code></p>
    <p><code> vector‹int› v;</code></p>
    <p><code> v.pop_back(); // Generates an empty object error.</code></p>
    <p><code> cout ‹‹ "returned from pop_back()" ‹‹ endl;</code></p>
    <p><code> os_set_error_handler(old_h);</code></p>
    <p><code> v.pop_back(); // Generates an empty object error.</code></p>
    <p><code> cout ‹‹ "successful termination" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>incl0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers1[5] = {1, 2, 3, 4, 5};</code></p>
    <p><code>int numbers2[5] = {1, 2, 4, 8, 16};</code></p>
    <p><code>int numbers3[2] = {4, 8};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> if (includes(numbers1, numbers1 + 5, numbers3, numbers3 + 2))</code></p>
    <p><code>  cout ‹‹ "numbers1 includes numbers3" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "numbers1 does not include numbers3" ‹‹ endl;</code></p>
    <p><code> if (includes(numbers2, numbers2 + 5, numbers3, numbers3 + 2))</code></p>
    <p><code>  cout ‹‹ "numbers2 includes numbers3" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "numbers2 does not include numbers3" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setdiff2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>char* word1 = "ABCDEFGHIJKLMNO";</code></p>
    <p><code>char* word2 = "LMNOPQRSTUVWXYZ";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> ostream_iterator‹char› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "word1: ";</code></p>
    <p><code> copy(word1, word1 + ::strlen(word1), iter);</code></p>
    <p><code> cout ‹‹ "\nword2: ";</code></p>
    <p><code> copy(word2, word2 + ::strlen(word2), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_difference(word1, word1 + ::strlen(word1),  word2, word2 + ::strlen(word2), iter, less‹char›());</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setunon2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>char* word1 = "ABCDEFGHIJKLMNO";</code></p>
    <p><code>char* word2 = "LMNOPQRSTUVWXYZ";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> ostream_iterator‹char› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "word1: ";</code></p>
    <p><code> copy(word1, word1 + ::strlen(word1), iter);</code></p>
    <p><code> cout ‹‹ "\nword2: ";</code></p>
    <p><code> copy(word2, word2 + ::strlen(word2), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_union(word1, word1 + ::strlen(word1),  word2, word2 + ::strlen(word2), iter, less‹char›());</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>unique2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_equal(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) == 0 ? 1: 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* labels[] = {"Q","Q","W","W","E","E","R","T","T","Y","Y"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned count = sizeof(labels) / sizeof(labels[0]);</code></p>
    <p><code> ostream_iterator‹char*› iter(cout);</code></p>
    <p><code> copy(labels, labels + count, iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> unique(labels, labels + count, str_equal);</code></p>
    <p><code> copy(labels, labels + count, iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>parsrtc1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = rand() % 10;</code></p>
    <p><code> vector‹int› result(5);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> partial_sort_copy(v1.begin(), v1.end(), result.begin(), result.end());</code></p>
    <p><code> copy(result.begin(), result.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>equal1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = i;</code></p>
    <p><code> vector‹int› v2(10);</code></p>
    <p><code> if (equal(v1.begin(), v1.end(), v2.begin())) cout ‹‹ "v1 is equal to v2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "v1 is not equal to v2" ‹‹ endl;</code></p>
    <p><code> copy(v1.begin(), v1.end(), v2.begin());</code></p>
    <p><code> if (equal(v1.begin(), v1.end(), v2.begin())) cout ‹‹ "v1 is equal to v2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "v1 is not equal to v2" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>equal0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers1[5] = {1, 2, 3, 4, 5};</code></p>
    <p><code>int numbers2[5] = {1, 2, 4, 8, 16};</code></p>
    <p><code>int numbers3[2] = {1, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> if (equal(numbers1, numbers1 + 5, numbers2)) </code></p>
    <p><code>  cout ‹‹ "numbers1 is equal to numbers2" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "numbers1 is not equal to numbers2" ‹‹ endl;</code></p>
    <p><code> if (equal(numbers3, numbers3 + 2, numbers1))</code></p>
    <p><code>  cout ‹‹ "numbers3 is equal to numbers1" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "numbers3 is not equal to numbers1" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>genern2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <empty-line/>
    <p><code>class Fibonacci {</code></p>
    <p><code>public:</code></p>
    <p><code> Fibonacci(): v1(0), v2(1) {}</code></p>
    <p><code> int operator() ();</code></p>
    <p><code>private:</code></p>
    <p><code> int v1;</code></p>
    <p><code> int v2;</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int Fibonacci::operator() () {</code></p>
    <p><code> int r = v1 + v2;</code></p>
    <p><code> v1 = v2;</code></p>
    <p><code> v2 = r;</code></p>
    <p><code> return v1;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> Fibonacci generator;</code></p>
    <p><code> generate_n(v1.begin(), v1.size(), generator);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>gener2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <empty-line/>
    <p><code>class Fibonacci {</code></p>
    <p><code>public:</code></p>
    <p><code> Fibonacci(): v1(0), v2(1) {}</code></p>
    <p><code> int operator() ();</code></p>
    <p><code> private:</code></p>
    <p><code> int v1;</code></p>
    <p><code> int v2;</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int Fibonacci::operator() () {</code></p>
    <p><code> int r = v1 + v2;</code></p>
    <p><code> v1 = v2;</code></p>
    <p><code> v2 = r;</code></p>
    <p><code> return v1;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> Fibonacci generator;</code></p>
    <p><code> generate(v1.begin(), v1.end(), generator);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>repcpif1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool odd(int a_) {</code></p>
    <p><code> return a_ % 2;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = i % 5;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> replace_copy_if(v1.begin(), v1.end(), v2.begin(), odd, 42);</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setsymd.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int v1[3] = {13, 18, 23};</code></p>
    <p><code>int v2[4] = {10, 13, 17, 23};</code></p>
    <p><code>int result[4] = {0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> set_symmetric_difference(v1, v1 + 3, v2, v2 + 4, result);</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>deque1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> deque‹int› d;</code></p>
    <p><code> d.push_back(4); // Add after end.</code></p>
    <p><code> d.push_back(9);</code></p>
    <p><code> d.push_back(16);</code></p>
    <p><code> d.push_front(1); // Insert at beginning.</code></p>
    <p><code> for (int i = 0; i ‹ d.size(); i++) cout ‹‹ "d[" ‹‹ i ‹‹ "] = " ‹‹ d[i] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> d.pop_front(); // Erase first element.</code></p>
    <p><code> d[2] = 25; // Replace last element.</code></p>
    <p><code> for (i = 0; i ‹ d.size(); i++)</code></p>
    <p><code> cout ‹‹ "d[" ‹‹ i ‹‹ "] = " ‹‹ d[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>findif1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool div_3(int a_) {</code></p>
    <p><code> return a_ % 3 ? 0 : 1;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef vector‹int› IntVec;</code></p>
    <p><code> IntVec v(10);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = (i + 1) * (i + 1);</code></p>
    <p><code> IntVec::iterator iter;</code></p>
    <p><code> iter = find_if(v.begin(), v.end(), div_3);</code></p>
    <p><code> if (iter!= v.end())</code></p>
    <p><code>  cout ‹‹ "Value " ‹‹ *iter ‹‹ " at offset " ‹‹ (iter - v.begin()) ‹‹ " is divisible by 3" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ucompos1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹math.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>struct square_root: public unary_function‹double, double› {</code></p>
    <p><code> square_root() {}</code></p>
    <p><code> double operator() (double x_) const {return sqrt(x_);}</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int input[3] = {-1, -4, -16};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[3];</code></p>
    <p><code> transform(input, input + 3, output, unary_compose‹square_root, negate‹int› ›(square_root(), negate‹int›()));</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rawiter.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>class X {</code></p>
    <p><code>public:</code></p>
    <p><code> X(int i_ = 0): i (i_) {}</code></p>
    <p><code> operator int() const {return i;}</code></p>
    <p><code>private:</code></p>
    <p><code> int i;</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> os_heap_allocator‹X› a;</code></p>
    <p><code> // Allocate (but do not construct) storage for 5 elements.</code></p>
    <p><code>  os_heap_allocator‹X›::pointer p = a.allocate(5);</code></p>
    <p><code> raw_storage_iterator‹X*, X› r(p);</code></p>
    <p><code> for (int i = 0; i ‹ 5; i++) *r++ = X(i);</code></p>
    <p><code> for (i = 0; i ‹ 5; i++) cout ‹‹ *p++ ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>set2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> set‹int, less‹int› › s;</code></p>
    <p><code> pair‹set‹int, less‹int› ›::const_iterator, bool› p;</code></p>
    <p><code> p = s.insert(42);</code></p>
    <p><code> if (p.second) cout ‹‹ "Inserted new element " ‹‹ *(p.first) ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Existing element = " ‹‹ *(p.first) ‹‹ endl;</code></p>
    <p><code> p = s.insert(42);</code></p>
    <p><code> if (p.second) cout ‹‹ "Inserted new element " ‹‹ *(p.first) ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "Existing element = " ‹‹ *(p.first) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mset3.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {3, 6, 1, 2, 3, 2, 6, 7, 9};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> multiset‹int, less‹int› › s(array, array + 9);</code></p>
    <p><code> multiset‹int, less‹int› ›::iterator i;</code></p>
    <p><code> // Return location of first element that is not less than 3</code></p>
    <p><code> i = s.lower_bound(3);</code></p>
    <p><code> cout ‹‹ "lower bound = " ‹‹ *i ‹‹ endl;</code></p>
    <p><code> // Return location of first element that is greater than 3</code></p>
    <p><code> i = s.upper_bound(3);</code></p>
    <p><code> cout ‹‹ "upper bound = " ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>binsrch2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_compare(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹  0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* labels[] = {"aa", "dd", "ff", "jj", "ss", "zz"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned count = sizeof(labels) / sizeof(labels[0]);</code></p>
    <p><code> if (binary_search(labels, labels + count, "ff", str_compare)) cout ‹‹ "ff is in labels." ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "ff is not in labels." ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>nthelem2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = rand() % 10;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> nth_element(v1.begin(), v1.begin() + v1.size() / 2, v1.end(), greater‹int›());</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setintr1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> vector‹int› v2(10);</code></p>
    <p><code> iota(v2.begin(), v2.end(), 7);</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "v1: ";</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ "\nv2: ";</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setdiff1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> vector‹int› v2(10);</code></p>
    <p><code> iota(v2.begin(), v2.end(), 7);</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "v1: ";</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ "\nv2: ";</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>adjdiff2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int mult(int a_, int b_) {</code></p>
    <p><code> return a_ * b_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(10);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i + 1;</code></p>
    <p><code> vector‹int› rslt(v.size()); </code></p>
    <p><code> adjacent_difference(v.begin(), v.end(), rslt.begin(), mult);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v.begin(), v.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(rslt.begin(), rslt.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rotate1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  rotate(v1.begin(), v1.begin() + i, v1.end());</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code>}</code></p>
    <p><code>cout ‹‹ endl;</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setunon1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> vector‹int› v2(10);</code></p>
    <p><code> iota(v2.begin(), v2.end(), 7);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "v1: ";</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ "\nv2: ";</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>insert1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char* array1[] = {"laurie", "jennifer", "leisa"};</code></p>
    <p><code>char* array2[] = {"amanda", "saskia", "carrie"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> deque‹char*› names(array1, array1 + 3);</code></p>
    <p><code> deque‹char*›::iterator i = names.begin() + 2;</code></p>
    <p><code> copy(array2, array2 + 3, insert_iterator‹deque ‹char*› ›(names, i));</code></p>
    <p><code> deque‹char*›::iterator j;</code></p>
    <p><code> for (j = names.begin(); j!= names.end(); j++) cout ‹‹ *j ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ucompos2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹math.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>struct square_root: public unary_function‹double, double› {</code></p>
    <p><code> square_root() {}</code></p>
    <p><code> double operator() (double x_) const {return sqrt(x_);}</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int input[3] = {-1, -4, -16};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[3];</code></p>
    <p><code> transform(input, input + 3, output, compose1(square_root(), negate‹int›()));</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>parsrt1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++)</code></p>
    <p><code> v1[i] = rand() % 10;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> partial_sort(v1.begin(), v1.begin() + v1.size() / 2, v1.end());</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>equal2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool values_squared(int a_, int b_) {</code></p>
    <p><code> return (a_ * a_ == b_);</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> vector‹int› v2(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = i;</code></p>
    <p><code>  v2[i] = i * i;</code></p>
    <p><code> }</code></p>
    <p><code> if (equal(v1.begin(), v1.end(), v2.begin(), values_squared))</code></p>
    <p><code>  cout ‹‹ "v2[i] == v1[i] * v1[i]" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "v2[i] != v1[i] * v1[i]" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>inplmrg2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = (v1.size() - i - 1) % 5;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> inplace_merge(v1.begin(), v1.begin() + 5, v1.end(), greater‹int›());</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>nthelem1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = rand() % 10;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> nth_element(v1.begin(), v1.begin() + v1.size() / 2, v1.end());</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec4.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(4);</code></p>
    <p><code> v[0] = 1;</code></p>
    <p><code> v[1] = 4;</code></p>
    <p><code> v[2] = 9;</code></p>
    <p><code> v[3] = 16;</code></p>
    <p><code> cout ‹‹ "front = " ‹‹ v.front() ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "back = " ‹‹ v.back() ‹‹ ", size = " ‹‹ v.size() ‹‹ endl;</code></p>
    <p><code> v.push_back(25);</code></p>
    <p><code> cout ‹‹ "back = " ‹‹ v.back() ‹‹ ", size = " ‹‹ v.size() ‹‹ endl;</code></p>
    <p><code> v.pop_back();</code></p>
    <p><code> cout ‹‹ "back = " ‹‹ v.back() ‹‹ ", size = " ‹‹ v.size() ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>lwrbnd2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool char_str_less(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* str[] = {"a", "a", "b", "b", "q", "w", "z"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned strCt = sizeof(str)/sizeof(str[0]);</code></p>
    <p><code> cout ‹‹ "d can be inserted at index: "</code></p>
    <p><code>  ‹‹ (lower_bound(str, str + strCt, "d", char_str_less) - str) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>pheap2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v;</code></p>
    <empty-line/>
    <p><code> v.push_back(1);</code></p>
    <p><code> v.push_back(20);</code></p>
    <p><code> v.push_back(4);</code></p>
    <p><code> make_heap(v.begin(), v.end(), greater‹int›());</code></p>
    <empty-line/>
    <p><code> v.push_back(7);</code></p>
    <p><code> push_heap(v.begin(), v.end(), greater‹int›());</code></p>
    <empty-line/>
    <p><code> sort_heap(v.begin(), v.end(), greater‹int›());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v.begin(), v.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <empty-line/>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>insert2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char* array1[] = {"laurie", "jennifer", "leisa"};</code></p>
    <p><code>char* array2[] = {"amanda", "saskia", "carrie"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> deque‹char*› names(array1, array1 + 3);</code></p>
    <p><code> deque‹char*›::iterator i = names.begin() + 2;</code></p>
    <p><code> copy(array2, array2 + 3, inserter(names, i));</code></p>
    <p><code> deque‹char*›::iterator j;</code></p>
    <p><code> for (j = names.begin(); j!= names.end(); j++) cout ‹‹ *j ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>} </code></p>
   </section>
   <section>
    <title>
     <p>uprbnd2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool char_str_less(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* str[] = {"a", "a", "b", "b", "q", "w", "z"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned strCt = sizeof(str)/sizeof(str[0]);</code></p>
    <p><code> cout ‹‹ "d can be inserted at index: "</code></p>
    <p><code>  ‹‹ upper_bound(str, str + strCt, "d", char_str_less) - str ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec3.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹char› v1; // Empty vector of characters.</code></p>
    <p><code> v1.push_back('h');</code></p>
    <p><code> v1.push_back('i');</code></p>
    <p><code> cout ‹‹ "v1 = " ‹‹ v1[0] ‹‹ v1[1] ‹‹ endl;</code></p>
    <p><code> vector‹char› v2(v1);</code></p>
    <p><code> v2[1] = 'o'; // Replace second character.</code></p>
    <p><code> cout ‹‹ "v2 = " ‹‹ v2[0] ‹‹ v2[1] ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "(v1 == v2) = " ‹‹ (v1 == v2) ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "(v1 ‹ v2) = " ‹‹ (v1 ‹ v2) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>iter4.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v; // Empty vector of integers.</code></p>
    <p><code> v.push_back(1);</code></p>
    <p><code> v.push_back(2);</code></p>
    <p><code> v.push_back(3);</code></p>
    <p><code> // Position immediately after last item.</code></p>
    <p><code> vector‹int›::iterator i = v.end();</code></p>
    <p><code> // Move back one and then access.</code></p>
    <p><code>  cout ‹‹ "last element is " ‹‹ *--i ‹‹ endl;</code></p>
    <p><code> i -= 2; // Jump back two items.</code></p>
    <p><code> cout ‹‹ "first element is " ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setdiff0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int v1[3] = {13, 18, 23};</code></p>
    <p><code>int v2[4] = {10, 13, 17, 23};</code></p>
    <p><code>int result[4] = {0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> set_difference(v1, v1 + 3, v2, v2 + 4, result);</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> set_difference(v2, v2 + 4, v1, v1 + 2, result);</code></p>
    <p><code> for (i = 0; i ‹ 4; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>lexcmp2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>const unsigned size = 6;</code></p>
    <p><code>char n1[size] = "shoe";</code></p>
    <p><code>char n2[size] = "shine";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> bool before = lexicographical_compare(n1, n1 + size, n2, n2 + size, greater‹char›());</code></p>
    <p><code> if (before) cout ‹‹ n1 ‹‹ " is after " ‹‹ n2 ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ n2 ‹‹ " is after " ‹‹ n1 ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>adjdiff1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(10);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i * i;</code></p>
    <p><code> vector‹int› result(v.size());</code></p>
    <p><code> adjacent_difference(v.begin(), v.end(), result.begin());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v.begin(), v.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(result.begin(), result.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>stblptn1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = rand() % 20;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> stable_partition(v1.begin(), v1.end(), bind2nd(less‹int›(), 11));</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ptition1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = rand() % 20;</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> partition(v1.begin(), v1.end(), bind2nd(less‹int›(), 11));</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1; // Empty vector of integers.</code></p>
    <p><code> cout ‹‹ "empty = " ‹‹ v1.empty() ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "size = " ‹‹ v1.size() ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "max_size = " ‹‹ v1.max_size() ‹‹ endl;</code></p>
    <p><code> v1.push_back(42); // Add an integer to the vector.</code></p>
    <p><code> cout ‹‹ "size = " ‹‹ v1.size() ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "v1[0] = " ‹‹ v1[0] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>sort2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 50, -10, 11, 42, 19};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int count = sizeof(array) / sizeof(array[0]);</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> cout ‹‹ "before: ";</code></p>
    <p><code> copy(array, array + count, iter);</code></p>
    <p><code> cout ‹‹ "\nafter: ";</code></p>
    <p><code> sort(array, array + count, greater‹int›());</code></p>
    <p><code> copy(array, array + count, iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>copy4.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef vector‹int› IVec;</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int loc = 0; loc ‹ v1.size(); loc++) v1[loc] = loc;</code></p>
    <p><code> vector‹int› v2;</code></p>
    <p><code> insert_iterator‹IVec› i (v2, v2.begin());</code></p>
    <p><code> copy(v1.begin(), v1.end(), i);</code></p>
    <p><code> ostream_iterator‹int› outiter(cout, " ");</code></p>
    <p><code> copy(v2.begin(), v2.end(), outIter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>prevprm2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(3);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (int i = 0; i ‹ 9; i++) {</code></p>
    <p><code>  prev_permutation(v1.begin(), v1.end(), greater‹int›());</code></p>
    <p><code>  copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code>  cout ‹‹ endl;</code></p>
    <p><code> }</code></p>
    <p><code>return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>trnsfrm2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>char map_char(char a_, int b_) {</code></p>
    <p><code> return char(a_ + b_);</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int trans[] = {-4, 4, -6, -6, -10, 0, 10, -6, 6, 0, -1, -77};</code></p>
    <p><code>char n[] = "Larry Mullen";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned count  = ::strlen(n);</code></p>
    <p><code> ostream_iterator ‹char› iter(cout);</code></p>
    <p><code> transform(n, n + count, trans, iter, map_char);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>iter1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹const char*› v; // Vector of character strings.</code></p>
    <p><code> v.push_back((char*) "zippy"); // First element.</code></p>
    <p><code> v.push_back((char*) "motorboy"); // Second element.</code></p>
    <p><code> vector‹const char*›::iterator i = v.begin(); // Position at end.</code></p>
    <p><code> for (i = v.begin(); i != v.end(); i++) cout ‹‹ *i ‹‹ endl; // Display item.</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>maxelem2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_compare(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* names[] = {"Brett", "Graham", "Jack", "Mike", "Todd"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned namesCt = sizeof(names)/sizeof(names[0]);</code></p>
    <p><code> cout ‹‹ *max_element(names, names + namesCt, str_compare) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>minelem2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_compare(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* names[] = {"Brett", "Graham", "Jack", "Mike", "Todd"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned namesCt = sizeof(names)/sizeof(names[0]);</code></p>
    <p><code> cout ‹‹ *min_element(names, names + namesCt, str_compare) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>partsum2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(5);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 1);</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> partial_sum(v1.begin(), v1.end(), v2.begin(), times‹int›());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>istmit1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> char buffer[100];</code></p>
    <p><code> int i = 0;</code></p>
    <p><code> cin.unsetf(ios::skipws); // Disable white-space skipping.</code></p>
    <p><code> cout ‹‹ "Please enter a string: ";</code></p>
    <p><code> istream_iterator‹char, ptrdiff_t› s(cin);</code></p>
    <p><code> while (*s!= '\n') buffer[i++] = *s++;</code></p>
    <p><code> buffer[i] = '\0'; // Null terminate buffer.</code></p>
    <p><code> cout ‹‹ "read " ‹‹ buffer ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>findif0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool odd(int a_) {</code></p>
    <p><code> return a_ % 2;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {2, 4, 8, 15, 32, 64};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* location = find_if(numbers, numbers + 6, odd);</code></p>
    <p><code> if (location != numbers + 6)</code></p>
    <p><code>  cout ‹‹ "Value " ‹‹ *location ‹‹ " at offset " ‹‹ (location - numbers) ‹‹ " is odd" ‹‹ endl; </code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>pheap1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v;</code></p>
    <empty-line/>
    <p><code> v.push_back(1);</code></p>
    <p><code> v.push_back(20);</code></p>
    <p><code> v.push_back(4);</code></p>
    <p><code> make_heap(v.begin(), v.end());</code></p>
    <empty-line/>
    <p><code> v.push_back(7);</code></p>
    <p><code> push_heap(v.begin(), v.end());</code></p>
    <empty-line/>
    <p><code> sort_heap(v.begin(), v.end());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v.begin(), v.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <empty-line/>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>stblsrt2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool string_less(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>char* letters[6] = {"bb", "aa", "ll", "dd", "qq", "cc"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> stable_sort(letters, letters + 6, string_less);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ letters[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>nextprm1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(3);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (int i = 0; i ‹ 9; i++) {</code></p>
    <p><code>  next_permutation(v1.begin(), v1.end());</code></p>
    <p><code>  copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code>  cout ‹‹ endl;</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>prevprm1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(3);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (int i = 0; i ‹ 9; i++) {</code></p>
    <p><code>  prev_permutation(v1.begin(), v1.end());</code></p>
    <p><code>  copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code>  cout ‹‹ endl;</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rndshuf1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) {</code></p>
    <p><code>  random_shuffle(v1.begin(), v1.end());</code></p>
    <p><code>  copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code>  cout ‹‹ endl;</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ptrbinf1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int sum(int x_, int y_) {</code></p>
    <p><code> return x_ + y_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int input1[4] = {7, 2, 3, 5};</code></p>
    <p><code>int input2[4] = {1, 5, 5, 8};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, pointer_to_binary_function‹int, int, int›(sum));</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>iter2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>void print (const vector‹const char*›&amp; v_) {</code></p>
    <p><code> vector‹const char*›::const_iterator i;</code></p>
    <p><code> for (i = v_.begin(); i != v_.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹const char*› v; // Vector of character strings.</code></p>
    <p><code> v.push_back((char*) "zippy");</code></p>
    <p><code> v.push_back((char*) "motorboy");</code></p>
    <p><code> print (v);</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>partsum1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> partial_sum(v1.begin(), v1.end(), v2.begin());</code></p>
    <p><code> ostream_iterator ‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>replif1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool odd(int a_) {</code></p>
    <p><code> return a_ % 2;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = i % 5;</code></p>
    <p><code>  cout ‹‹ v1[i] ‹‹ ' ';</code></p>
    <p><code> }</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> replace_if(v1.begin(), v1.end(), odd, 42);</code></p>
    <p><code> for (i = 0; i ‹ v1.size(); i++) cout ‹‹ v1[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mset4.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {3, 6, 1, 2, 3, 2, 6, 7, 9};</code></p>
    <empty-line/>
    <p><code>int main() </code><code>{</code></p>
    <p><code> typedef multiset‹int, less‹int› › mset;</code></p>
    <p><code> mset s(array, array + 9);</code></p>
    <p><code> pair‹mset::const_iterator, mset::const_iterator› p = s.equal_range(3);</code></p>
    <p><code> cout ‹‹ "lower bound = " ‹‹ *(p.first) ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "upper bound = " ‹‹ *(p.second) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>iter3.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹const char*› v; // Vector of character strings.</code></p>
    <p><code> v.push_back((char*) "zippy"); // First element.</code></p>
    <p><code> v.push_back((char*) "motorboy"); // Second element.</code></p>
    <p><code> vector‹const char*›::reverse_iterator i;</code></p>
    <p><code> for (i = v.rbegin(); i!= v.rend(); i++) cout ‹‹ *i ‹‹ endl; // Display item.</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>list2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array1[] = {1, 16};</code></p>
    <p><code>int array2[] = {4, 9};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> list‹int› l1(array1, array1 + 2);</code></p>
    <p><code> list‹int› l2(array2, array2 + 2);</code></p>
    <p><code> list‹int›::iterator i = l1.begin();</code></p>
    <p><code> i++;</code></p>
    <p><code> l1.splice(i, l2, l2.begin(), l2.end());</code></p>
    <p><code> i = l1.begin();</code></p>
    <p><code> while (i != l1.end()) cout ‹‹ *i++ ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>set1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> set‹int, less‹int› › s;</code></p>
    <p><code> cout ‹‹ "count(42) = " ‹‹ s.count(42) ‹‹ endl;</code></p>
    <p><code> s.insert(42);</code></p>
    <p><code> cout ‹‹ "count(42) = " ‹‹ s.count(42) ‹‹ endl;</code></p>
    <p><code> s.insert(42);</code></p>
    <p><code> cout ‹‹ "count(42) = " ‹‹ s.count(42) ‹‹ endl;</code></p>
    <p><code> int count = s.erase(42);</code></p>
    <p><code> cout ‹‹ count ‹‹ " elements erased" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>list1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array1[] = {9, 16, 36};</code></p>
    <p><code>int array2[] = {1, 4};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> list‹int› l1(array1, array1 + 3);</code></p>
    <p><code> list‹int› l2(array2, array2 + 2);</code></p>
    <p><code> list‹int›::iterator i1 = l1.begin();</code></p>
    <p><code> l1.splice(i1, l2);</code></p>
    <p><code> list‹int›::iterator i2 = l1.begin();</code></p>
    <p><code> while (i2!= l1.end()) cout ‹‹ *i2++ ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>alg5.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> list‹int› years;</code></p>
    <p><code> years.push_back(1962);</code></p>
    <p><code> years.push_back(1992);</code></p>
    <p><code> years.push_back(2001);</code></p>
    <p><code> years.push_back(1999);</code></p>
    <p><code> sort(years.begin(), years.end()); // Causes linker error.</code></p>
    <p><code> list‹int›::iterator i;</code></p>
    <p><code> for (i = years.begin(); i != years.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>eqlrnge0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[10] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> pair ‹int*, int*› range;</code></p>
    <p><code> range = equal_range(numbers, numbers + 10, 2);</code></p>
    <p><code> cout ‹‹ "2 can be inserted from before index " ‹‹ (range.first - numbers)</code></p>
    <p><code>  ‹‹ " to before index " ‹‹ (range.second - numbers) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>advance.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef vector‹int› IntVector;</code></p>
    <p><code> IntVector v(10);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i;</code></p>
    <p><code> IntVector::iterator location = v.begin();</code></p>
    <p><code> cout ‹‹ "At Beginning: " ‹‹ *location ‹‹ endl;</code></p>
    <p><code> advance(location, 5);</code></p>
    <p><code> cout ‹‹ "At Beginning + 5: " ‹‹ *location ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>replace1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = i % 5;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> replace(v1.begin(), v1.end(), 2, 42);</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>alg3.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› i;</code></p>
    <p><code> i.push_back(1);</code></p>
    <p><code> i.push_back(4);</code></p>
    <p><code> i.push_back(2);</code></p>
    <p><code> i.push_back(8);</code></p>
    <p><code> i.push_back(2);</code></p>
    <p><code> i.push_back(2);</code></p>
    <p><code> int n = 0; // Must be initialized, as count increments n.</code></p>
    <p><code> count(i.begin(), i.end(), 2, n);</code></p>
    <p><code> cout ‹‹ "Count of 2s = " ‹‹ n ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>func2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool bigger_than(int x_, int y_) {</code></p>
    <p><code> return x_ › y_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int›v;</code></p>
    <p><code> v.push_back(4);</code></p>
    <p><code> v.push_back(1);</code></p>
    <p><code> v.push_back(5);</code></p>
    <p><code> sort(v.begin(), v.end(), bigger_than);</code></p>
    <p><code> vector‹int›::iterator i;</code></p>
    <p><code> for (i = v.begin(); i != v.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>unegate1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>struct odd: public unary_function‹int, bool› {</code></p>
    <p><code> odd() {}</code></p>
    <p><code> bool operator() (int n_) const {return (n_ % 2) - 1;}</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* p = find_if(array, array + 3, unary_negate‹odd›(odd()));</code></p>
    <p><code> if (p != array + 3)</code></p>
    <p><code> cout ‹‹ *p ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>alg4.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› years;</code></p>
    <p><code> years.push_back(1962);</code></p>
    <p><code> years.push_back(1992);</code></p>
    <p><code> years.push_back(2001);</code></p>
    <p><code> years.push_back(1999);</code></p>
    <p><code> sort(years.begin(), years.end());</code></p>
    <p><code> vector‹int›::iterator i;</code></p>
    <p><code> for (i = years.begin(); i!= years.end(); i++)</code></p>
    <p><code> cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>countif1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int odd(int a_) {</code></p>
    <p><code> return a_ % 2;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› numbers(100);</code></p>
    <p><code> for (int i = 0; i ‹ 100; i++) numbers[i] = i % 3;</code></p>
    <p><code> int elements = 0;</code></p>
    <p><code> count_if(numbers.begin(), numbers.end(), odd, elements);</code></p>
    <p><code> cout ‹‹ "Found " ‹‹ elements ‹‹ " odd elements." ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>lwrbnd1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(20);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) {</code></p>
    <p><code>  v1[i] = i/4;</code></p>
    <p><code>  cout ‹‹ v1[i] ‹‹ ' ';</code></p>
    <p><code> }</code></p>
    <p><code> int* location = lower_bound(v1.begin(), v1.end(), 3);</code></p>
    <p><code> cout ‹‹ "\n3 can be inserted at index: " ‹‹ (location - v1.begin()) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>lexcmp1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>const unsigned size = 6;</code></p>
    <p><code>char n1[size] = "shoe";</code></p>
    <p><code>char n2[size] = "shine";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> bool before = lexicographical_compare(n1, n1 + size, n2, n2 + size);</code></p>
    <p><code> if (before) cout ‹‹ n1 ‹‹ " is before " ‹‹ n2 ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ n2 ‹‹ " is before " ‹‹ n1 ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>copyb.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = i;</code></p>
    <p><code> vector‹int› v2(v1.size());</code></p>
    <p><code> copy_backward(v1.begin(), v1.end(), v2.end());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ptrbinf2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int sum(int x_, int y_) {</code></p>
    <p><code> return x_ + y_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int input1[4] = {7, 2, 3, 5};</code></p>
    <p><code>int input2[4] = {1, 5, 5, 8};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, ptr_fun(sum));</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>copyb0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[5] = {1, 2, 3, 4, 5};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result[5];</code></p>
    <p><code> copy_backward(numbers, numbers + 5, result + 5);</code></p>
    <p><code> for (int i = 0; i ‹ 5; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (i = 0; i ‹ 5; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>binsert1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char* array[] = {"laurie", "jennifer", "leisa"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹char*› names;</code></p>
    <p><code> copy(array, array + 3, back_insert_iterator‹vector‹char*› ›(names));</code></p>
    <p><code> vector‹char*›::iterator i;</code></p>
    <p><code> for (i = names.begin(); i!= names.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>unegate2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>struct odd: public unary_function‹int, bool› {</code></p>
    <p><code> odd() {}</code></p>
    <p><code> bool operator() (int n_) const {return (n_ % 2) - 1;}</code></p>
    <p><code>};</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* p = find_if(array, array + 3, not1 (odd()));</code></p>
    <p><code> if (p != array + 3) cout ‹‹ *p ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>revcopy1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 1, 2, 3, 4, 5};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result[6];</code></p>
    <p><code> reverse_copy(numbers, numbers + 6, result);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (i = 0; i ‹ 6; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>finsert1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char* array[] = {"laurie", "jennifer", "leisa"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> deque‹char*› names;</code></p>
    <p><code> copy(array, array + 3, front_insert_iterator‹deque ‹char*› ›(names));</code></p>
    <p><code> deque‹char*›::iterator i;</code></p>
    <p><code> for (i = names.begin(); i!= names.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>remcpif1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool odd(int a_) {</code></p>
    <p><code> return a_ % 2;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {1, 2, 3, 1, 2, 3};</code></p>
    <p><code>int result[6] = {0, 0, 0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> remove_copy_if(numbers, numbers + 6, result, odd);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>inplmrg1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {1, 10, 42, 3, 16, 32};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> inplace_merge(numbers, numbers + 3, numbers + 6);</code></p>
    <p><code> for (i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>list4.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array1[] = {1, 3, 6, 7};</code></p>
    <p><code>int array2[] = {2, 4};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> list‹int› l1(array1, array1 + 4);</code></p>
    <p><code> list‹int› l2(array2, array2 + 2);</code></p>
    <p><code> l1.merge(l2);</code></p>
    <p><code> for (list‹int›::iterator i = l1.begin(); i != l1.end(); i++) cout ‹‹ *i;</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>revbit1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 5, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> list‹int› v(array, array + 4);</code></p>
    <p><code> reverse_bidirectional_iterator‹list‹int›::iterator, int, list‹int›::reference, list‹int›::difference_type› r(v.end());</code></p>
    <p><code> while (r != v.begin())</code></p>
    <p><code> cout ‹‹ *r++ ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>copy3.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = i;</code></p>
    <p><code> vector‹int› v2(10);</code></p>
    <p><code> copy(v1.begin(), v1.end(), v2.begin());</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v2.begin(), v2.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>merge0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers1[5] = {1, 6, 13, 25, 101};</code></p>
    <p><code>int numbers2[5] = {-5, 26, 36, 46, 99};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result[10];</code></p>
    <p><code> merge(numbers1, numbers1 + 5, numbers2, numbers2 + 5, result);</code></p>
    <p><code> for (int i = 0; i ‹ 10; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>reviter1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 5, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(array, array + 4);</code></p>
    <p><code> stl_reverse_iterator‹vector‹int›::iterator, int, vector‹int›::reference, vector‹int›::difference_type› r (v.end());</code></p>
    <p><code> while (r!= v.begin()) cout ‹‹ *r++ ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>find1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int years[] = {1942, 1952, 1962, 1972, 1982, 1992};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> const unsigned yearCount = sizeof(years) / sizeof(years[0]);</code></p>
    <p><code> int* location = find(years, years + yearCount, 1972);</code></p>
    <p><code> cout ‹‹ "Found 1972 at offset " ‹‹ (location - years) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>trnsfrm1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int negate_int(int a_) {</code></p>
    <p><code> return -a_;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {-5, -1, 0, 1, 6, 11};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result[6];</code></p>
    <p><code> transform(numbers, numbers + 6, result, negate_int);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>binsert2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char* array[] = {"laurie", "jennifer", "leisa"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹char*› names;</code></p>
    <p><code> copy(array, array + 3, back_inserter(names));</code></p>
    <p><code> vector‹char*›::iterator i;</code></p>
    <p><code> for (i = names.begin(); i!= names.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>finsert2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char* array[] = {"laurie", "jennifer", "leisa"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> deque‹char*› names;</code></p>
    <p><code> copy(array, array + 3, front_inserter(names));</code></p>
    <p><code> deque‹char*›::iterator i;</code></p>
    <p><code> for (i = names.begin(); i!= names.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mset2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>char* names[] = {"dave", "alf", "chas", "bob", "ed", "chas"};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> typedef multiset‹char*, less_s› mset;</code></p>
    <p><code> mset s;</code></p>
    <p><code> s.insert(names, names + 6);</code></p>
    <p><code> for (mset::iterator i = s.begin(); i!= s.end(); i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ostmit.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 5, 2, 4};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> char* string = "hello";</code></p>
    <p><code> ostream_iterator‹char› it1(cout);</code></p>
    <p><code> copy(string, string + 5, it1);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> ostream_iterator‹int› it2(cout);</code></p>
    <p><code> copy(array, array + 4, it2);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ptrunf1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool even(int n_) {</code></p>
    <p><code> return (n_ % 2) == 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* p = find_if(array, array + 3, pointer_to_unary_function‹int, bool›(even));</code></p>
    <p><code> if (p != array + 3) cout ‹‹ *p ‹‹ " is even" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>func1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool bigger(int i_) {</code></p>
    <p><code> return i_ › 3;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v;</code></p>
    <p><code> v.push_back(4);</code></p>
    <p><code> v.push_back(1);</code></p>
    <p><code> v.push_back(5);</code></p>
    <p><code> int n = 0;</code></p>
    <p><code> count_if(v.begin(), v.end(), bigger, n);</code></p>
    <p><code> cout ‹‹ "Number greater than 3 = " ‹‹ n ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>stblptn0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool less_10(int a_) {</code></p>
    <p><code> return a_ ‹ 10 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {10, 5, 11, 20, 6, -2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> stable_partition(numbers, numbers + 6, less_10);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setunon0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int v1[3] = {13, 18, 23};</code></p>
    <p><code>int v2[4] = {10, 13, 17, 23};</code></p>
    <p><code>int result[7] = {0, 0, 0, 0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> set_union(v1, v1 + 3, v2, v2 + 4, result);</code></p>
    <p><code> for (int i = 0; i ‹ 7; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mkheap1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {5, 10, 4, 13, 11, 19};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> make_heap(numbers, numbers + 6, greater‹int›());</code></p>
    <p><code> for (int i = 6; i ›= 1; i--) {</code></p>
    <p><code>  cout ‹‹ numbers[0] ‹‹ endl;</code></p>
    <p><code>  pop_heap(numbers, numbers + i, greater‹int›());</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>setintr0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int v1[3] = {13, 18, 23};</code></p>
    <p><code>int v2[4] = {10, 13, 17, 23};</code></p>
    <p><code>int result[4] = {0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> set_intersection(v1, v1 + 3, v2, v2 + 4, result);</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>logicand.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool input1[4] = {1, 1, 0, 1};</code></p>
    <p><code>bool input2[4] = {0, 1, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, logical_and‹bool›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>logicor.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool input1[4] = {1, 1, 0, 1};</code></p>
    <p><code>bool input2[4] = {0, 1, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, logical_or‹bool›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>nequal.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input1[4] = {1, 7, 2, 2};</code></p>
    <p><code>int input2[4] = {1, 6, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, not_equal_to‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ptition0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int less_10(int a_) {</code></p>
    <p><code> return a_ ‹ 10 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {6, 12, 3, 10, 1, 20};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> partition(numbers, numbers + 6, less_10);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>inrprod0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>int vector1[5] = {1, 2, 3, 4, 5};</code></p>
    <p><code>int vector2[5] = {1, 2, 3, 4, 5};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result;</code></p>
    <p><code> result = inner_product(vector1, vector1 + 5, vector2, 0);</code></p>
    <p><code> cout ‹‹ "Inner product = " ‹‹ result ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>func3.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int›v;</code></p>
    <p><code> v.push_back(4);</code></p>
    <p><code> v.push_back(1);</code></p>
    <p><code> v.push_back(5);</code></p>
    <p><code> sort(v.begin(), v.end(), greater‹int›());</code></p>
    <p><code> vector‹int›::iterator i;</code></p>
    <p><code> for (i = v.begin(); i != v.end(); i++)  cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>modulus.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input1[4] = {6, 8, 10, 2};</code></p>
    <p><code>int input2[4] = {4, 2, 11, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, modulus‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>uprbnd1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int array[20];</code></p>
    <p><code> for (int i = 0; i ‹ 20; i++) {</code></p>
    <p><code>  array[i] = i/4;</code></p>
    <p><code>  cout ‹‹ array[i] ‹‹ ' ';</code></p>
    <p><code> }</code></p>
    <p><code> cout ‹‹ "\n3 can be inserted at index: "</code></p>
    <p><code>  ‹‹ upper_bound(array, array + 20, 3) - array ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>equalto.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input1[4] = {1, 7, 2, 2};</code></p>
    <p><code>int input2[4] = {1, 6, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, equal_to‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>count1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› numbers(100);</code></p>
    <p><code> for (int i = 0; i ‹ 100; i++) numbers[i] = i % 3;</code></p>
    <p><code> int elements = 0;</code></p>
    <p><code> count(numbers.begin(), numbers.end(), 2, elements);</code></p>
    <p><code> cout ‹‹ "Found " ‹‹ elements ‹‹ " 2's." ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>uniqcpy1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[8] = {0, 1, 1, 2, 2, 2, 3, 4};</code></p>
    <p><code>int result[8] = {0, 0, 0, 0, 0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> unique_copy(numbers, numbers + 8, result);</code></p>
    <p><code> for (int i = 0; i ‹ 8; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>minus.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input1[4] = {1, 5, 7, 8};</code></p>
    <p><code>int input2[4] = {1, 4, 8, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[4];</code></p>
    <p><code> transform(input1, input1 + 4, input2, output, minus‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>replcpy1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 1, 2, 0, 1, 2};</code></p>
    <p><code>int result[6] = {0, 0, 0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> replace_copy(numbers, numbers + 6, result, 2, 42);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>swprnge1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> char* word1 = "World";</code></p>
    <p><code> char* word2 = "Hello";</code></p>
    <p><code> cout ‹‹ word1 ‹‹ " " ‹‹ word2 ‹‹ endl;</code></p>
    <p><code> swap_ranges(word1, word1 + ::strlen(word1), word2);</code></p>
    <p><code> cout ‹‹ word1 ‹‹ " " ‹‹ word2 ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec8.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v;</code></p>
    <p><code> cout ‹‹ "capacity = " ‹‹ v.capacity() ‹‹ endl;</code></p>
    <p><code> v.push_back(42);</code></p>
    <p><code> cout ‹‹ "capacity = " ‹‹ v.capacity() ‹‹ endl;</code></p>
    <p><code> v.reserve (5000);</code></p>
    <p><code> cout ‹‹ "capacity = " ‹‹ v.capacity() ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>plus.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input1[4] = {1, 6, 11, 8};</code></p>
    <p><code>int input2[4] = {1, 5, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int total = inner_product(input1, input1 + 4, input2, 0, plus‹int›(), times‹int›());</code></p>
    <p><code> cout ‹‹ "total = " ‹‹ total ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>remcopy1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {1, 2, 3, 1, 2, 3};</code></p>
    <p><code>int result[6] = {0, 0, 0, 0, 0, 0};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> remove_copy(numbers, numbers + 6, result, 2);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>error2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>// Compile this code with the symbol OS_USE_EXCEPTIONS defined.</code></p>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v;</code></p>
    <p><code> try {</code></p>
    <p><code>  v.pop_back(); // Generates an exception.</code></p>
    <p><code> } catch (const char* str) {</code></p>
    <p><code>  cout ‹‹ "Caught exception " ‹‹ str ‹‹ endl;</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>iterswp1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(6);</code></p>
    <p><code> iota(v1.begin(), v1.end(), 0);</code></p>
    <p><code> iter_swap(v1.begin(), v1.begin() + 3);</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v1.begin(), v1.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>remif1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>bool odd(int a_) {</code></p>
    <p><code> return a_ % 2;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 0, 1, 1, 2, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> remove_if(numbers, numbers + 6, odd);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++)</code></p>
    <p><code> cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>foreach1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>void print_sqr(int a_) {</code></p>
    <p><code> cout ‹‹ a_ * a_ ‹‹ " ";</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> for (int i = 0; i ‹ v1.size(); i++) v1[i] = i;</code></p>
    <p><code> for_each(v1.begin(), v1.end(), print_sqr);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>parsrtc0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {5, 2, 4, 3, 1, 6};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result[3];</code></p>
    <p><code> partial_sort_copy(numbers, numbers + 6, result, result + 3);</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>pqueue2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> priority_queue‹deque‹char*›, greater_s› q;</code></p>
    <p><code> q.push((char*) "cat");</code></p>
    <p><code> q.push((char*) "dog");</code></p>
    <p><code> q.push((char*) "ape");</code></p>
    <p><code> while (!q.empty()) {</code></p>
    <p><code>  cout ‹‹ q.top() ‹‹ endl;</code></p>
    <p><code>  q.pop();</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>binsrch1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int vector[100];</code></p>
    <p><code> for (int i = 0; i ‹ 100; i++) vector[i] = i;</code></p>
    <p><code> if (binary_search(vector, vector + 100, 42)) cout ‹‹ "found 42" ‹‹ endl;</code></p>
    <p><code> else cout ‹‹ "did not find 42" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>ptrunf2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool even(int n_) {</code></p>
    <p><code> return (n_ % 2) == 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* p = find_if(array, array + 3, ptr_fun(even));</code></p>
    <p><code> if (p != array + 3) cout ‹‹ *p ‹‹ " is even" ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rotcopy0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 1, 2, 3, 4, 5};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result[6];</code></p>
    <p><code> rotate_copy(numbers, numbers + 3, numbers + 6, result);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>mkheap0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {5, 10, 4, 13, 11, 19};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> make_heap(numbers, numbers + 6);</code></p>
    <p><code> for (int i = 6; i ›= 1; i--) {</code></p>
    <p><code>  cout ‹‹ numbers[0] ‹‹ endl;</code></p>
    <p><code>  pop_heap(numbers, numbers + i);</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>copy1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>char string[23] = "A string to be copied.";</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> char result[23];</code></p>
    <p><code> copy(string, string + 23, result);</code></p>
    <p><code> cout ‹‹ " Src: " ‹‹ string ‹‹ "\nDest: " ‹‹ result ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>find0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[10] = {0, 1, 4, 9, 16, 25, 36, 49, 64};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* location;</code></p>
    <p><code> location = find(numbers, numbers + 10, 25);</code></p>
    <p><code> cout ‹‹ "Found 25 at offset " ‹‹ (location - numbers) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>partsum0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {1, 2, 3, 4, 5, 6};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result[6];</code></p>
    <p><code> partial_sum(numbers, numbers + 6, result);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i ++) cout ‹‹ result[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bvec1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> bit_vector b(3);</code></p>
    <p><code> for (int i = 0; i ‹ b.size(); i++) cout ‹‹ b[i];</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> b[0] = b[2] = 1;</code></p>
    <p><code> for (i = 0; i ‹ b.size(); i++) cout ‹‹ b[i];</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bind2nd1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> replace_if(array, array + 3, binder2nd‹greater‹int› ›(greater‹int›(), 2), 4);</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bind1st1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* p = remove_if(array, array + 3, binder1st‹less‹int› ›(less‹int›(), 2));</code></p>
    <p><code> for (int* i = array; i != p; i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>reviter2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 5, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(array, array + 4);</code></p>
    <p><code> vector‹int›::reverse_iterator r;</code></p>
    <p><code> for (r = v.rbegin(); r != v.rend(); r++) cout ‹‹ *r ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>copy2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(10);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) v[i] = i;</code></p>
    <p><code> ostream_iterator‹int› iter(cout, " ");</code></p>
    <p><code> copy(v.begin(), v.end(), iter);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>max2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_compare(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> cout ‹‹ max("shoe", "shine", str_compare) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>min2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹string.h›</code></p>
    <empty-line/>
    <p><code>bool str_compare(const char* a_, const char* b_) {</code></p>
    <p><code> return ::strcmp(a_, b_) ‹ 0 ? 1 : 0;</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> cout ‹‹ min("shoe", "shine", str_compare) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>parsrt0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {5, 2, 4, 3, 1, 6};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> partial_sort(numbers, numbers + 3, numbers + 6);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>partsrt0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {5, 2, 4, 3, 1, 6};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> partial_sort(numbers, numbers + 3, numbers + 6);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bnegate1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[4] = {4, 9, 7, 1};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> sort(array, array + 4, binary_negate‹greater‹int› ›(greater‹int›()));</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>nthelem0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {5, 2, 4, 1, 0, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> nth_element(numbers, numbers + 3, numbers + 6);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>revbit2.cpp</p>
    </title>
    <empty-line/>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 5, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> list‹int› v(array, array + 4);</code></p>
    <p><code> list‹int›::reverse_iterator r;</code></p>
    <p><code> for (r = v.rbegin(); r != v.rend(); r++) cout ‹‹ *r ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>count0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[10] = {1, 2, 4, 1, 2, 4, 1, 2, 4, 1};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result = 0;</code></p>
    <p><code> count(numbers, numbers + 10, 1, result);</code></p>
    <p><code> cout ‹‹ "Found " ‹‹ result ‹‹ " 1's." ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>negate.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int output[3];</code></p>
    <p><code> transform(input, input + 3, output, negate‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ output[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>pqueue1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> priority_queue‹deque‹int›, less‹int› › q;</code></p>
    <p><code> q.push(42);</code></p>
    <p><code> q.push(101);</code></p>
    <p><code> q.push(69);</code></p>
    <p><code> while (!q.empty()) {</code></p>
    <p><code>  cout ‹‹ q.top() ‹‹ endl;</code></p>
    <p><code>  q.pop();</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>genern1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v1(10);</code></p>
    <p><code> generate_n(v1.begin(), v1.size(), rand);</code></p>
    <p><code> for (int i = 0; i ‹ 10; i++) cout ‹‹ v1[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rotate0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 1, 2, 3, 4, 5};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> rotate(numbers, numbers + 3, numbers + 6);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>foreach0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>void print(int a_) {</code></p>
    <p><code> cout ‹‹ a_ ‹‹ ' ';</code></p>
    <p><code>}</code></p>
    <empty-line/>
    <p><code>int numbers[10] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> for_each(numbers, numbers + 10, print);</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>alg2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int i[] = {1, 4, 2, 8, 2, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int n = 0; // Must be initialized, as count increments n.</code></p>
    <p><code> count(i, i + 6, 2, n);</code></p>
    <p><code> cout ‹‹ "Count of 2s = " ‹‹ n ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>gener1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stdlib.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int numbers[10];</code></p>
    <p><code> generate(numbers, numbers + 10, rand);</code></p>
    <p><code> for (int i = 0; i ‹ 10; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>replace0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 1, 2, 0, 1, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> replace(numbers, numbers + 6, 2, 42);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>rndshuf0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {1, 2, 3, 4, 5, 6};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> random_shuffle(numbers, numbers + 6);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bind1st2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int* p = remove_if(array, array + 3, bind1st(less‹int›(), 2));</code></p>
    <p><code> for (int* i = array; i != p; i++) cout ‹‹ *i ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>unique1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[8] = {0, 1, 1, 2, 2, 2, 3, 4};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> unique(numbers, numbers + 8);</code></p>
    <p><code> for (int i = 0; i ‹ 8; i ++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bind2nd2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[3] = {1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> replace_if(array, array + 3, bind2nd(greater‹int (), 2), 4);</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>vec5.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[] = {1, 4, 9, 16};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(array, array + 4);</code></p>
    <p><code> for (int i = 0; i ‹ v.size(); i++) cout ‹‹ "v[" ‹‹ i ‹‹ "] = " ‹‹ v[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>iterswp0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 1, 2, 3, 4, 5};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> iter_swap(numbers, numbers + 3);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>remove1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {1, 2, 3, 1, 2, 3};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> remove(numbers, numbers + 6, 1);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>stblsrt1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int array[6] = {1, 50, -10, 11, 42, 19};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> stable_sort(array, array + 6);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ array[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>reverse1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {0, 1, 2, 3, 4, 5};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> reverse(numbers, numbers + 6);</code></p>
    <p><code> for (int i = 0; i ‹ 6; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>logicnot.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>bool input[7] = {1, 0, 0, 1, 1, 1, 1};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int n = 0;</code></p>
    <p><code> count_if(input, input + 7, logical_not‹bool›(), n);</code></p>
    <p><code> cout ‹‹ "count = " ‹‹ n ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>bnegate2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[4] = {4, 9, 7, 1};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> sort(array, array + 4, not2(greater‹int›()));</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>queue1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> queue‹list‹int› › q;</code></p>
    <p><code> q.push(42);</code></p>
    <p><code> q.push(101);</code></p>
    <p><code> q.push(69);</code></p>
    <p><code> while (!q.empty()) {</code></p>
    <p><code>  cout ‹‹ q.front() ‹‹ endl;</code></p>
    <p><code>  q.pop();</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>stack1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> stack‹deque‹int› › s;</code></p>
    <p><code> s.push(42);</code></p>
    <p><code> s.push(101);</code></p>
    <p><code> s.push(69);</code></p>
    <p><code> while (!s.empty()) {</code></p>
    <p><code>  cout ‹‹ s.top() ‹‹ endl;</code></p>
    <p><code>  s.pop();</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>greateq.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[4] = {3, 1, 4, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> sort(array, array + 4, greater_equal‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>stack2.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> stack‹list‹int› › s;</code></p>
    <p><code> s.push(42);</code></p>
    <p><code> s.push(101);</code></p>
    <p><code> s.push(69);</code></p>
    <p><code> while (!s.empty()) {</code></p>
    <p><code>  cout ‹‹ s.top() ‹‹ endl;</code></p>
    <p><code>  s.pop();</code></p>
    <p><code> }</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>lesseq.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[4] = {3, 1, 4, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> sort(array, array + 4, less_equal‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>divides.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input[3] = {2, 3, 4};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int result = accumulate(input, input + 3, 48, divides‹int›());</code></p>
    <p><code> cout ‹‹ "result = " ‹‹ result ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>greater.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[4] = {3, 1, 4, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> sort(array, array + 4, greater‹int›());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>swap1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int a = 42;</code></p>
    <p><code> int b = 19;</code></p>
    <p><code> cout ‹‹ "a = " ‹‹ a ‹‹ " b = " ‹‹ b ‹‹ endl;</code></p>
    <p><code> swap(a, b);</code></p>
    <p><code> cout ‹‹ "a = " ‹‹ a ‹‹ " b = " ‹‹ b ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>times.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int input[4] = {1, 5, 7, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int total = accumulate(input, input + 4, 1, times‹int›());</code></p>
    <p><code> cout ‹‹ "total = " ‹‹ total ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>less.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int array[4] = {3, 1, 4, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> sort(array, array + 4, less‹int› ());</code></p>
    <p><code> for (int i = 0; i ‹ 4; i++) cout ‹‹ array[i] ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>alg1.cpp</p>
    </title>
    <p><code>#include ‹iostream.h›</code></p>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int i = min(4, 7);</code></p>
    <p><code> cout ‹‹ "min(4, 7) = " ‹‹ i ‹‹ endl;</code></p>
    <p><code> char c = maX('a', 'z');</code></p>
    <p><code> cout ‹‹ "maX('a', 'z') = " ‹‹ c ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>filln1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(10);</code></p>
    <p><code> fill_n(v.begin(), v.size(), 42);</code></p>
    <p><code> for (int i = 0; i ‹ 10; i++) cout ‹‹ v[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>iota1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int numbers[10];</code></p>
    <p><code> iota(numbers, numbers + 10, 42);</code></p>
    <p><code> for (int i = 0; i ‹ 10; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>nextprm0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int v1[3] = {0, 1, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> next_permutation(v1, v1 + 3);</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ v1[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>prevprm0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int v1[3] = {0, 1, 2};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> prev_permutation(v1, v1 + 3);</code></p>
    <p><code> for (int i = 0; i ‹ 3; i++) cout ‹‹ v1[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>fill1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v(10);</code></p>
    <p><code> fill(v.begin(), v.end(), 42);</code></p>
    <p><code> for (int i = 0; i ‹ 10; i++) cout ‹‹ v[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>pair2.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> pair‹int, int› p = make_pair(1, 10);</code></p>
    <p><code> cout ‹‹ "p.first = " ‹‹ p.first ‹‹ endl;</code></p>
    <p><code> cout ‹‹ "p.second = " ‹‹ p.second ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>error1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <empty-line/>
    <p><code>// Compile this code without defining the symbol OS_USE_EXCEPTIONS.</code></p>
    <p><code>int main() {</code></p>
    <p><code> vector‹int› v;</code></p>
    <p><code> v.pop_back(); // Generates an empty object error.</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>pair0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> pair‹int, int› p = make_pair(1, 10);</code></p>
    <p><code> cout ‹‹ "p.first = " ‹‹ p.first ‹‹ ", p.second = " ‹‹ p.second ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>pair1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> pair‹int, int› p = make_pair(1, 10);</code></p>
    <p><code> cout ‹‹ "p.first = " ‹‹ p.first ‹‹ ", p.second = " ‹‹ p.second ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>minelem1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {-10, 15, -100, 36, -242, 42};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> cout ‹‹ *min_element(numbers, numbers + 6) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>maxelem1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[6] = {4, 10, 56, 11, -42, 19};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> cout ‹‹ *max_element(numbers, numbers + 6) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>max1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> cout ‹‹ max(42, 100) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>min1.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> cout ‹‹ min(42, 100) ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
   <section>
    <title>
     <p>adjdiff0.cpp</p>
    </title>
    <p><code>#include ‹stl.h›</code></p>
    <p><code>#include ‹iostream.h›</code></p>
    <empty-line/>
    <p><code>int numbers[5] = {1, 2, 4, 8, 16};</code></p>
    <empty-line/>
    <p><code>int main() {</code></p>
    <p><code> int difference[5];</code></p>
    <p><code> adjacent_difference(numbers, numbers + 5, difference);</code></p>
    <p><code> for (int i = 0; i ‹ 5; i++) cout ‹‹ numbers[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> for (i = 0; i ‹ 5; i++) cout ‹‹ difference[i] ‹‹ ' ';</code></p>
    <p><code> cout ‹‹ endl;</code></p>
    <p><code> return 0;</code></p>
    <p><code>}</code></p>
   </section>
  </section>
 </body>
</FictionBook>
