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

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

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

// ΠΈΡΠΊΠ°Ρ‚ΡŒ срСди элСмСнтов, начиная с ia[1] ΠΈ Π΄ΠΎ, Π½ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ, ia[4]

auto result = find(ia +1, ia + 4, val);

Как Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ find(). Π•Π΅ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ являСтся поиск ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта Π² Π½Π΅ отсортированной ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ элСмСнтов. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ функция find() Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия.

1. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ элСмСнту ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

2. Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ этот элСмСнт с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

3. Π•сли элСмСнт соотвСтствуСт искомому, функция find() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ этот элСмСнт.

4. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС функция find() ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту ΠΈ повторяСт этапы 2 ΠΈ 3.

5. ΠŸΠΎ достиТСнии ΠΊΠΎΠ½Ρ†Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ функция find() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ.

6. Π”остигнув ΠΊΠΎΠ½Ρ†Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, функция find() Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ поиска. Π’ΠΈΠΏ этого значСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ совмСстимым с Ρ‚ΠΈΠΏΠΎΠΌ значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° этапС 3.

Ни ΠΎΠ΄Π½ΠΎ ΠΈΠ· этих дСйствий Π½Π΅ зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит элСмСнты. Пока Π΅ΡΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹Π΅ для доступа ΠΊ элСмСнтам, функция find() Π² любом случаС Π½Π΅ зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ элСмСнтов).

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ нСзависимыми ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° контСйнСра…

ВсС этапы Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find(), ΠΊΡ€ΠΎΠΌΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ срСдствами ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ обращСния ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° прСдоставляСт доступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ элСмСнта; Ссли элСмСнт соотвСтствуСт искомому, функция find() ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° этот элСмСнт; ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт; ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ послС ΠΊΠΎΠ½Ρ†Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ достиТСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ find() ΠΊΠΎΠ½Ρ†Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ; функция find() Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ послС ΠΊΠΎΠ½Ρ†Π° (см. Ρ€Π°Π·Π΄Π΅Π» 9.2.1), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ поиска.

…но Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ зависят ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° элСмСнтов

Π₯отя ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ нСзависимыми ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½Ρƒ (ΠΈΠ»ΠΈ большС) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ° элСмСнта. НапримСр, этап 2 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == Ρ‚ΠΈΠΏΠ° элСмСнта для сравнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта с прСдоставлСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΈΠΏ элСмСнта ΠΈΠΌΠ΅Π» ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <. Но, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для использования вмСсто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.1. Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ algorithm ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° функция count(), подобная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find(). Она ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ элСмСнтов, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΡ… искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ΠžΡ€Π³Π°Π½ΠΈΠ·ΡƒΠΉΡ‚Π΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл. ΠžΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚Π΅ подсчСт элСмСнтов с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.2. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π² список (list) строк.

ΠšΠ»ΡŽΡ‡Π΅Π²Π°Ρ концСпция. Алгоритмы Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²

ΠžΠ±Ρ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Они Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Π° Π½Π΅ функциями ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»Π΅Π½, Π½ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΉ смысл: ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ "ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅" ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π½Π΅ способны ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ исходного ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Как Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано Π΄Π°Π»Π΅Π΅, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ способны ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ элСмСнтов ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Однако ΠΎΠ½ΠΈ Π½Π΅ способны Π½ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ, Π½ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ сами элСмСнты.

Как Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 10.4.1, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ классы ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ способны Π½Π° нСсколько большСС, Ρ‡Π΅ΠΌ просто ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ элСмСнтов. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вставки. Когда Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт добавлСния элСмСнта Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² самих Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… это Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

10.2. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдоставляСт большС ста Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠ°ΠΊ ΠΈ Ρƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Сдинообразная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. ПониманиС этой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ упростит ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ использованиС всСх ста с лишним Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π±Π΅Π· нСобходимости ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ…. Π’ этой Π³Π»Π°Π²Π΅ рассматриваСтся использованиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ описаны Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ А пСрСчислСны всС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ согласно ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π—Π° нСбольшим ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, всС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ элСмСнтов. Π”Π°Π»Π΅Π΅ этот Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ исходным Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ (input range). Алгоритмы, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с исходным Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ, всСгда ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ для обозначСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ послС послСднСго элСмСнта, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ исходным Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ, ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ элСмСнты этого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. ΠŸΡ€ΠΎΡ‰Π΅ всСго ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π½Π° Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠ΅, Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈ ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ порядок элСмСнтов.

10.2.1. Алгоритмы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния

Много Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ значСния элСмСнтов Π² исходном Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΈΡ…. Ѐункция find() ΠΈ функция count(), использованная Π² упраТнСниях Ρ€Π°Π·Π΄Π΅Π»Π° 10.1, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Ρ‚Π°ΠΊΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Π”Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ являСтся accumulate(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ numeric. Ѐункция accumulate() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ суммируСмых элСмСнтов, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ β€” исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для суммы. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ vec β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Ρ… чисСл.

// суммируСт элСмСнты Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vec, начиная со значСния 0

int sum = accumulate(vec.cbegin(), vec.cend(), 0);

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ суммируСт значСния элСмСнтов Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vec, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ 0 ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ суммы.

Π’ΠΈΠΏ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accumulate() опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ суммы Π±ΡƒΠ΄Π΅Ρ‚ использован ΠΈ ΠΊΠ°ΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accumulate().

Алгоритмы ΠΈ Ρ‚ΠΈΠΏΡ‹ элСмСнтов

Π£ Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ функция accumulate() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свой Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ для суммирования, Π΅ΡΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ послСдствиС: ΠΎΠ½ позволяСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ элСмСнта ΠΊ Ρ‚ΠΈΠΏΡƒ суммы. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΈΠΏ элСмСнтов ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ‚ΠΈΠΏΡƒ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ элСмСнтами Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vec ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ числа, ΠΈΠ»ΠΈ числа Ρ‚ΠΈΠΏΠ° double, ΠΈΠ»ΠΈ long long, ΠΈΠ»ΠΈ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠ° int.

НапримСр, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ string ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ +, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accumulate() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ элСмСнтов Π²Π΅ΠΊΡ‚ΠΎΡ€Π° строк:

string sum = accumulate(v.cbegin(), v.cend(), string(""));

Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² добавляСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π²Π΅ΠΊΡ‚ΠΎΡ€Π° v ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ пустой строкС sum. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ здСсь явно ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса string. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° строки ΠΊΠ°ΠΊ символьного Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΏΡ€ΠΈΠ²Π΅Π»Π° Π±Ρ‹ ΠΊ ошибкС ΠΏΡ€ΠΈ компиляции.

// ошибка: no + on const char*

string sum = accumulate(v.cbegin(), v.cend(), "");

Если Π±Ρ‹ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π», Ρ‚ΠΈΠΏΠΎΠΌ суммируСмых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ оказался Π±Ρ‹ const char*. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ ΠΈ опрСдСляСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ +. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ const char* Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° +, этот Π²Ρ‹Π·ΠΎΠ² Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π‘ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚, Π½ΠΎ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² элСмСнты, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ cbegin() ΠΈ cend() (см. Ρ€Π°Π·Π΄Π΅Π» 9.2.3). Но Ссли Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ планируСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния значСния элСмСнта, Ρ‚ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ begin() ΠΈ end().

Алгоритмы, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с двумя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, equal(), позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, содСрТат Π»ΠΈ Π΄Π²Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ значСния. Он сравниваСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ элСмСнтом Π²Ρ‚ΠΎΡ€ΠΎΠΉ. Алгоритм Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты Ρ€Π°Π²Π½Ρ‹, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Он ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°: ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° (ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ) ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ элСмСнтов ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

// roster2 Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ элСмСнтов,

// сколько и roster1

equal(roster1.cbegin(), roster1.cend(), roster2.cbegin());