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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 40

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

На настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ достаточно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ†ΠΈΠΊΠ»Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ элСмСнты Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связаны ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹.

3.4.2. АрифмСтичСскиС дСйствия с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ элСмСнт. Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ всСх Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Аналогично ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ == ΠΈ != ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для сравнСния Π΄Π²ΡƒΡ… допустимых ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² (см. Ρ€Π°Π·Π΄Π΅Π» 3.4) Π»ΡŽΠ±Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ².

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ строк ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π° нСсколько ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π·Π° Ρ€Π°Π·. Они Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ всС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния. Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ арифмСтичСскими дСйствиями с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (iterator arithmetic). Они ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π». 3.7.


Π’Π°Π±Π»ΠΈΡ†Π° 3.7. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ строк

iter + n iter - n Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ (Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅) цСлочислСнного значСния n ΠΊ (ΠΈΠ·) ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° элСмСнт n ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π²ΠΏΠ΅Ρ€Π΅Π΄ (Π½Π°Π·Π°Π΄) Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° элСмСнт ΠΈΠ»ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° iter1 += n iter1 -= n БоставныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния со слоТСниСм ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ iter1 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° n ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ большС ΠΈΠ»ΠΈ мСньшС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ iter1 - iter2 Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ, Π²Π΅Ρ€Π½Π΅Ρ‚ Π»Π΅Π²Ρ‹ΠΉ. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° элСмСнты ΠΈΠ»ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° >, >=, <, <= ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Один ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ мСньшС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Ссли ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° элСмСнт, располоТСнный Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π±Π»ΠΈΠΆΠ΅ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° элСмСнты ΠΈΠ»ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° АрифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ

К ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (ΠΈΠ»ΠΈ Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ) цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ количСство ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π²ΠΏΠ΅Ρ€Π΅Π΄ (ΠΈΠ»ΠΈ Π½Π°Π·Π°Π΄). ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠΈ цСлочислСнного значСния ΠΈΠ· ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° элСмСнт Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ (ΠΈΠ»ΠΈ строкС) ΠΈΠ»ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° (ΠΈΠ»ΠΈ строки). Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° вычислим ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° элСмСнт, блиТайший ΠΊ сСрСдинС Π²Π΅ΠΊΡ‚ΠΎΡ€Π°:

// Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° элСмСнт, блиТайший ΠΊ сСрСдинС Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vi

auto mid = vi.begin() + vi.size() / 2;

Если Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vi 20 элСмСнтов, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ vi.size()/2 Π±ΡƒΠ΄Π΅Ρ‚ 10. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ mid Π±ΡƒΠ΄Π΅Ρ‚ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ vi.begin() + 10. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ нумСрация индСксов Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с 0, это Ρ‚ΠΎΡ‚ ΠΆΠ΅ элСмСнт, Ρ‡Ρ‚ΠΎ ΠΈ vi[10], Ρ‚.Π΅. элСмСнт Π½Π° Π΄Π΅ΡΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π°.

ΠšΡ€ΠΎΠΌΠ΅ сравнСния Π΄Π²ΡƒΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π° равСнство, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ строк ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сравнСния (<, <=, >, >=). Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ допустимы, Ρ‚.Π΅. Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ элСмСнты (ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ) Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ строки. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ it являСтся ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅, Ρ‡Ρ‚ΠΎ ΠΈ mid. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ it Π½Π° элСмСнт Π΄ΠΎ ΠΈΠ»ΠΈ послС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° mid:

if (it < mid)

 // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ элСмСнты Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vi

МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Ссли ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° элСмСнты (ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ) Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ строки. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” дистанция ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Под дистанциСй подразумСваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ цСлочислСнный Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ difference_type. Π’ΠΈΠΏ difference_type ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΈ для Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, ΠΈ для строки. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ вычитания ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ИспользованиС арифмСтичСских дСйствий с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ арифмСтичСскиС дСйствия с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, являСтся Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск (binary search). Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ (Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ) поиск ΠΈΡ‰Π΅Ρ‚ спСцифичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² отсортированной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Алгоритм Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ: сначала исслСдуСтся элСмСнт, блиТайший ΠΊ сСрСдинС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Если это искомый элСмСнт, Ρ€Π°Π±ΠΎΡ‚Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ссли этот элСмСнт мСньшС искомого, поиск продолТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ срСди элСмСнтов послС исслСдованного. Если срСдний элСмСнт большС искомого, поиск продолТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅. ВычисляСтся Π½ΠΎΠ²Ρ‹ΠΉ срСдний элСмСнт ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΈ дСйствия ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ΡΡ, ΠΏΠΎΠΊΠ° искомый элСмСнт Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΡ‡Π΅Ρ€ΠΏΠ°ΡŽΡ‚ΡΡ элСмСнты.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

// тСкст Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ отсортирован

// beg ΠΈ end ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ осущСствляСтся поиск

auto beg = text.begin(), end = text.end();

auto mid = text.begin() + (end - beg)/2; // исходная сСрСдина

// ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ элСмСнты ΠΈ искомый Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½

while (mid != end && *mid != sought) {

 if (sought < *mid) // находится Π»ΠΈ искомый элСмСнт Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅?

  end = mid;        // Ссли Π΄Π°, Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, игнорируя Π²Ρ‚ΠΎΡ€ΡƒΡŽ

                    // ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ

 else               // искомый элСмСнт Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅

  beg = mid + 1;    // Π½Π°Ρ‡Π°Ρ‚ΡŒ поиск с элСмСнта сразу послС сСрСдины

 mid = beg + (end - beg)/2; // новая сСрСдина

}

Код начинаСтся с опрСдСлСния Ρ‚Ρ€Π΅Ρ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²: beg Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, end β€” элСмСнтом послС послСднСго, a mid β€” блиТайшим ΠΊ сСрСдинС. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ эти ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ значСниями, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ вСсь Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vector<string> ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ text.

Π‘Π½Π°Ρ‡Π°Π»Π° Ρ†ΠΈΠΊΠ» провСряСт, Π½Π΅ пуст Π»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° mid Ρ€Π°Π²Π½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° end, Ρ‚ΠΎ элСмСнты для поиска исчСрпаны. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС условиС Π»ΠΎΠΆΠ½ΠΎ ΠΈ Ρ†ΠΈΠΊΠ» while Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ mid ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСтся Π½Π° соотвСтствиС искомому. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

Если элСмСнты всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ, ΠΊΠΎΠ΄ Π² Ρ†ΠΈΠΊΠ»Π΅ while ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, пСрСмСщая ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ end ΠΈΠ»ΠΈ beg. Если ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ mid элСмСнт большС, Ρ‡Π΅ΠΌ sought, Ρ‚ΠΎ Ссли искомый элСмСнт ΠΈ Π΅ΡΡ‚ΡŒ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅, ΠΎΠ½ находится ΠΏΠ΅Ρ€Π΅Π΄ элСмСнтом, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ mid. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты послС сСрСдины, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ, присваивая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° mid ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ end. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ *mid мСньшС, Ρ‡Π΅ΠΌ sought, элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ элСмСнтов послС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ mid. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ коррСктируСтся присвоСниСм ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ beg ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ сразу послС Ρ‚ΠΎΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ mid. Π£ΠΆΠ΅ извСстно, Ρ‡Ρ‚ΠΎ mid Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° искомый элСмСнт, поэтому Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.

Π’ ΠΊΠΎΠ½Ρ†Π΅ Ρ†ΠΈΠΊΠ»Π° while ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ mid Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ end Π»ΠΈΠ±ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° искомый элСмСнт. Если ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ mid Ρ€Π°Π²Π΅Π½ end, Ρ‚ΠΎ искомого элСмСнта Π½Π΅Ρ‚ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ text.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 3.4.2

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3.24. ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°ΠΉΡ‚Π΅ послСднСС ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π° 3.3.3 с использованиСм ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3.25. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ кластСризации ΠΎΡ†Π΅Π½ΠΎΠΊ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 3.3.3 с использованиСм ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² вмСсто индСксации.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3.26. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ поиска использован ΠΊΠΎΠ΄ mid = beg + (end - beg) / 2;, Π° Π½Π΅ mid = (beg + end) / 2;?

3.5. ΠœΠ°ΡΡΠΈΠ²Ρ‹

Массив (array) β€” это структура Π΄Π°Π½Π½Ρ‹Ρ…, подобная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ vector (см. Ρ€Π°Π·Π΄Π΅Π» 3.3), Π½ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ. Как ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€, массив являСтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ бСзымянных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, массивы ΠΈΠΌΠ΅ΡŽΡ‚ фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€; Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ элСмСнты ΠΊ массиву нСльзя. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ массивов постоянны, ΠΎΠ½ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Но это прСимущСство приобрСтаСтся Π·Π° счСт ΠΏΠΎΡ‚Π΅Ρ€ΠΈ гибкости.

Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ, сколько элСмСнтов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€.

3.5.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ инициализация встроСнных массивов