Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС STLΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 22

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ΅ΠΉΠ΅Ρ€Ρ

// arraySize символов, ΠΈ записываСт Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅.

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ количСство записанных чисСл Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚

// maxNumChars

size_t fillString(char *pArray. sizet arraySize);

vector<char> vc(maxNumChars); // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ vector, Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ

// Ρ€Π°Π²Π½Π° maxNumChars

size_t charsWritten = fillString(&vc[0],vc.size());

// Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ vc

// Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ fillString string s(vc.begin().vc.begin()+charsWritten);

// Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅

// ΠΈΠ· vc Π² s ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹ΠΌ

// конструктором (совСт 5)

БобствСнно, сам ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ сохранСния Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ API Π² vector ΠΈ ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ копирования Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ STL Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ всСгда:

size_t fillArray(double *pArray. size_t arraySize); // Π‘ΠΌ. Ρ€Π°Π½Π΅Π΅

vector<double> vd(maxNumDoubles);// Π’Π°ΠΊΠΆΠ΅ см. Ρ€Π°Π½Π΅Π΅

vd.resize(fillArray(&vd[0],vd.size());

deque<double> d(vd.begin().vd.end());// ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² deque

list<double> l(vd.begin().vd.end());// ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² list

set<double> s(vd.begin(),vd.end()):// ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² set

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, этот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ подсказываСт, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² STL, ΠΊΡ€ΠΎΠΌΠ΅ vector ΠΈ string, функциям Π‘. Для этого достаточно ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² vector ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅:

void doSomething(const int* pints. size_t numlnts); // Ѐункция Π‘ (см. Ρ€Π°Π½Π΅Π΅)

set<int> intSet:

// ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ

// хранятся ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅

// Π΄Π°Π½Π½Ρ‹Π΅

vector<int> v(intSet.begin(),intSet.end());// Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅

// ΠΈΠ· set Π² vector

if (!v.empty()) doSomething(&v[0],v.size());// ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² массив ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘, Π½ΠΎ Π·Π°Ρ‡Π΅ΠΌ это Π½ΡƒΠΆΠ½ΠΎ? Если Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π½Π΅ извСстСн Π½Π° стадии компиляции, ΠΏΠ°ΠΌΡΡ‚ΡŒ придСтся Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ динамичСски, Π° Π² совСтС 13 ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ вмСсто динамичСских массивов слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ vector.

Π‘ΠΎΠ²Π΅Ρ‚ 17. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ «фокус с пСрСстановкой» для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Смкости

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚Π΅Π»Π΅ΡˆΠΎΡƒ Β«Π‘Π΅ΡˆΠ΅Π½Ρ‹Π΅ дСньги». Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… участниках хранится Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅:

class Contestant {...};

vector<Contestant> contestants;

ΠŸΡ€ΠΈ объявлСнии Π½Π°Π±ΠΎΡ€Π° участников заявки ΡΡ‹ΠΏΠ»ΡŽΡ‚ΡΡ Π³Ρ€Π°Π΄ΠΎΠΌ, ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ быстро заполняСтся элСмСнтами. Но ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΎΡ‚Π±ΠΎΡ€Π° пСрспСктивных ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшоС количСство элСмСнтов пСрСмСщаСтся Π² Π½Π°Ρ‡Π°Π»ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° (вСроятно, Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ partial_sort ΠΈΠ»ΠΈ partition β€” см. совСт 31), Π° Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΈΠΊΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· Π²Π΅ΠΊΡ‚ΠΎΡ€Π° (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ erase β€” см. совСт 5). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ удалСния Π΄Π»ΠΈΠ½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ, Π½ΠΎ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ остаСтся ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ. Если Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ содСрТал Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ 100 000 ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ², Ρ‚ΠΎ Π΅Π³ΠΎ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ останСтся Ρ€Π°Π²Π½ΠΎΠΉ 100 000, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΠ·Π΄Π½Π΅Π΅ количСство элСмСнтов ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡΡ Π΄ΠΎ 10.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π½Π΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» Π½Π΅Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ срСдства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹ позволяли ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΎΡ‚ максимальной Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚. ПодобноС сокращСниС Смкости ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ называСтся «сТатиСм ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΡƒΒ». Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π»Π΅Π³ΠΊΠΎ программируСтся, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΊΠΎΠ΄ β€” ΠΊΠ°ΠΊ Π±Ρ‹ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΠΊΠ°Ρ‚Π½Π΅Π΅? β€” выглядит нСдостаточно ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

УсСчСниС лишнСй Смкости Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ contestants производится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

vector<Contestant>(contestants).swap(contestants);

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ vector<Contestant>(contestants) создаСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€, содСрТащий копию contestants; основная Ρ€Π°Π±ΠΎΡ‚Π° выполняСтся ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ конструктором vector. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ конструктор vector выдСляСт Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ памяти, сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для хранСния ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… элСмСнтов, поэтому Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π½Π΅ содСрТит лишнСй Смкости. Π—Π°Ρ‚Π΅ΠΌ содСрТимоС Π²Π΅ΠΊΡ‚ΠΎΡ€Π° contestants мСняСтся мСстами с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ swap. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² contestants оказываСтся содСрТимоС Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° с усСчСнной Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ, Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ содСрТит Β«Ρ€Π°Π·Π΄ΡƒΡ‚Ρ‹Π΅Β» Π΄Π°Π½Π½Ρ‹Π΅, Ρ€Π°Π½Π΅Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ²ΡˆΠΈΠ΅ΡΡ Π² contestants. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹) Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ уничтоТаСтся, освобоТдая ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ€Π°Π½Π΅Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ contestants.

Аналогичный ΠΏΡ€ΠΈΠ΅ΠΌ примСняСтся ΠΈ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ строкам:

string s;

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ строку ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· Π½Π΅Π΅ // Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ символов

string(s).swap(s);// Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ "сТатиС ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ" с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ s

Π― Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ стопроцСнтной Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ этом ΠΏΡ€ΠΈΠ΅ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° лишнюю Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ. Авторы Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… vector ΠΈ string лишнюю ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚. НапримСр, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ минимальной Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ ΠΆΠ΅ значСния Смкости vector/string ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ стСпСнями 2 (ΠΏΠΎ собствСнному ΠΎΠΏΡ‹Ρ‚Ρƒ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ Ρ‡Π°Ρ‰Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² рСализациях string, Π½Π΅ΠΆΠ΅Π»ΠΈ Π² рСализациях vector. Π—Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ совСту 15). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, «сТатиС ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΡƒΒ» слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π΅ ΠΊΠ°ΠΊ Β«ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ минимальной Смкости», Π° ΠΊΠ°ΠΊ Β«ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ минимальной Смкости, допускаСмой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Β». Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, это Π»ΡƒΡ‡ΡˆΠ΅Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ (Π½Π΅ считая ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ STL), поэтому «сТатиС ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΡƒΒ» для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² vector ΠΈ string фактичСски эквивалСнтно «фокусу с пСрСстановкой».

ΠšΡΡ‚Π°Ρ‚ΠΈ говоря, ΠΎΠ΄Π½Π° ΠΈΠ· разновидностСй «фокуса с пСрСстановкой» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для очистки ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ сокращСниСм Смкости Π΄ΠΎ минимальной Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ вашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Для этого Π² пСрСстановкС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ vector ΠΈΠ»ΠΈ string, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ создаСтся конструктором ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

vector<Contestant> v;

string s;

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ v ΠΈ s

vector <Contestant>().swap(v); // ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ v с ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ΠΌ Смкости

string().swap(s);// ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ s с ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ΠΌ Смкости

ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ послСднСС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅, относящССся ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ swap Π² Ρ†Π΅Π»ΠΎΠΌ. ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° содСрТимого Π΄Π²ΡƒΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ пСрСстановкС ΠΈΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ссылок. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ ссылки, ΠΎΡ‚Π½ΠΎΡΠΈΠ²ΡˆΠΈΠ΅ΡΡ ΠΊ элСмСнтам ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, послС Π²Ρ‹Π·ΠΎΠ²Π° swap ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚Π΅ ΠΆΠ΅ элСмСнты β€” Π½ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.

Π‘ΠΎΠ²Π΅Ρ‚ 18. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ vector<bool>

Vector<bool> ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ STL ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ лишь двумя нСдостатками. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ STL. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠ½ Π½Π΅ содСрТит bool.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ становится ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ STL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π½Π°Π·Π²Π°Π» Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌ β€” ΠΎΠ½ становится ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ STL лишь ΠΏΡ€ΠΈ соблюдСнии всСх Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 23.1 Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π° Π‘++. Π’ частности, Π² этих трСбованиях говорится, Ρ‡Ρ‚ΠΎ Ссли с β€” ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° Π’, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ [], Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ конструкция Π΄ΠΎΠ»ΠΆΠ½Π° Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ:

Π’ *Ρ€ = &с[0];// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π’* адрСсом Π΄Π°Π½Π½Ρ‹Ρ…,

// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ []

Π˜Π½Π°Ρ‡Π΅ говоря, Ссли ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ [ ] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π’ Π² Container<T>, Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ простым взятиСм Π΅Π³ΠΎ адрСса (прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ & Ρ‚ΠΈΠΏΠ° Π’ Π½Π΅ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΈΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΌ способом). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ vector<bool> Π±Ρ‹Π» ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ:

vector<bool> v;

bool *pb = &v[0]: // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ bool* адрСсом Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ vector<bool>::operator[]

Однако ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ vector<bool> β€” псСвдоконтСйнСр, содСрТащий Π½Π΅ настоящиС логичСскиС Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ bool, Π° ΠΈΡ… прСдставлСния, ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ для экономии мСста. Π’ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ каТдая псСвдовСличина Β«boolΒ», хранящаяся Π² псСвдовСкторС, Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚, Π° Π²ΠΎΡΡŒΠΌΠΈΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Π±Π°ΠΉΡ‚ прСдставляСт восСмь Β«boolΒ». Π’ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ прСдставлСнии vector<bool> Π±ΡƒΠ»Π΅Π²Ρ‹ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³Π°ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля, ΠΊΠ°ΠΊ ΠΈ bool, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… значСния, Π½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ «настоящими» логичСскими Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ ΠΈ ΠΌΠ°ΡΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΏΠΎΠ΄ Π½ΠΈΡ… Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ полями сущСствуСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ число bool ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹.

Бсылки Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ Ρ‚ΠΎΠΆΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ прСдставляСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ для Π΄ΠΈΠ·Π°ΠΉΠ½Π° интСрфСйса vector<bool>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция vector<T>::operator[] Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π’&. Если Π±Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ vector<bool> Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ содСрТал bool, этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ сущСствовало Π±Ρ‹, Π½ΠΎ вслСдствиС особСнностСй Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ прСдставлСния функция vector<T>::operator[] Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ссылку Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±ΠΈΡ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этим Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΠ΅ΠΌ, функция vector<T>::operator[] Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ссылку Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±ΠΈΡ‚ β€” Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Для использования STL Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ это вСсьма полСзная ΠΈΠ΄ΠΈΠΎΠΌΠ° Π‘++. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² совСтС 30 Β«More Effective Π‘++Β», Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π Π³ΠΎΡ…ΡƒΒ» ΠΊΠ½ΠΈΠ³ΠΈ Β«ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ проСктирования» [6]. На ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ vector<bool> выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ: