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

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

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

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния ΠΈ равСнства ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² (см. Ρ€Π°Π·Π΄Π΅Π» 9.2.7). Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ для Ρ‡Π»Π΅Π½ΠΎΠ² Π΄Π²ΡƒΡ… ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, слСва ΠΈ справа. Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ совпадСнии количСства ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ равСнства ΠΈΠ»ΠΈ нСравСнства, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ допустимо сравнСниС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Ρ‡Π»Π΅Π½ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ==; Π° для использования ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сравнСния допустимым Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <. НапримСр:

tuple<string, string> duo("1", "2");

tuple<size_t, size_t> twoD(1, 2);

bool b = (duo == twoD); // ошибка: нСльзя ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ size_t ΠΈ string

tuple<size_t, size_t, size_t> threeD(1, 2, 3);

b = (twoD < threeD);    // ошибка: Ρ€Π°Π·Π½ΠΎΠ΅ количСство Ρ‡Π»Π΅Π½ΠΎΠ²

tuple<size_t, size_t> origin(0, 0);

b = (origin < twoD);    // ok: b β€” это true

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ опрСдСляСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ < ΠΈ ==, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ ΠΊΠ»ΡŽΡ‡Π° Π² упорядочСнном ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, содСрТащий Ρ‚Ρ€ΠΈ Ρ‡Π»Π΅Π½Π° Ρ‚ΠΈΠΏΠ° int, ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ… значСниями 10, 20 ΠΈ 30.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.2. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, содСрТащий строку, Π²Π΅ΠΊΡ‚ΠΎΡ€ строки ΠΈ ΠΏΠ°Ρ€Ρƒ ΠΈΠ· строки ΠΈ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа (Ρ‚ΠΈΠΏΡ‹ string, vector<string> ΠΈ pair<string, int>).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.3. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ TextQuery ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 12.3 Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ вмСсто класса QueryResult. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π° ваш взгляд Π»ΡƒΡ‡ΡˆΠ΅ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

17.1.2. ИспользованиС ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ для возвращСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

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

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° имССтся Ρ„Π°ΠΉΠ» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΊΠ½ΠΈΠ³. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ нСкая другая функция Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ эти Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, создаСт Π²Π΅ΠΊΡ‚ΠΎΡ€ vector<Sales_data> для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ эти Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

// ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² Ρ„Π°ΠΉΠ»Π΅ содСрТит Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

// Π΄Π»Ρ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°

vector<vector<Sales_data>> files;

Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² поисках ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°, ΠΏΡ€ΠΎΠ΄Π°Π²ΡˆΠ΅Π³ΠΎ Π·Π°Π΄Π°Π½Π½ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ транзакция, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ для содСрТания индСкса этого ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ Π΄Π²ΡƒΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². ИндСкс Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π² Ρ„Π°ΠΉΠ»Π°Ρ…, Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ отмСтят ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ послС послСднСй записи ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ vector<Sales_data> этого ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°.

Ѐункция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ

Для Π½Π°Ρ‡Π°Π»Π° напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ. АргумСнтами этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ описанный Π²Π΅ΠΊΡ‚ΠΎΡ€ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ строка, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ISBN ΠΊΠ½ΠΈΠ³ΠΈ. Ѐункция Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ с записями ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΌΠ°Π³Π°Π·ΠΈΠ½Ρƒ, Π³Π΄Π΅ Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΠ΄Π°Π½Π° ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄Π½Π° заданная ΠΊΠ½ΠΈΠ³Π°:

// matches ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ‡Π»Π΅Π½Π°: индСкс ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Π΅Π³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅

typedef tuple<vector<Sales_data>::size_type,

              vector<Sales_data>::const_iterator,

              vector<Sales_data>::const_iterator> matches;

// files Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΌΠ°Π³Π°Π·ΠΈΠ½Ρƒ

// findBook() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ с записями для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°,

// ΠΏΡ€ΠΎΠ΄Π°Π²ΡˆΠ΅Π³ΠΎ Π΄Π°Π½Π½ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ

vector<matches>

findBook(const vector<vector<Sales_data>> &files,

         const string &book) {

 vector<matches> ret; // ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ пуст

 // для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π½Π°ΠΉΡ‚ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ½ΠΈΠ³Π΅

 // (Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ)

 for (auto it = files.cbegin(); it != files.cend(); ++it) {

  // Π½Π°ΠΉΡ‚ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Sales_data с Ρ‚Π΅ΠΌ ΠΆΠ΅ ISBN

  auto found = equal_range(it->cbegin(), it->cend(),

                           book, compareIsbn);

  if (found.first != found.second) // Ρƒ этого ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠΈ

   // Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ индСкс этого ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° соотвСтствий

   ret.push_back(make_tuple(it - files.cbegin(),

                            found.first, found.second));

 }

 return ret; // пуст, Ссли соотвСтствий Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ

}

Π¦ΠΈΠΊΠ» for ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ элСмСнты Π²Π΅ΠΊΡ‚ΠΎΡ€Π° files, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сами ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ. Π’ Ρ†ΠΈΠΊΠ»Π΅ for происходит Π²Ρ‹Π·ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° equal_range(), Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ°ΠΊ одноимСнная функция-Ρ‡Π»Π΅Π½ ассоциативного ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (см. Ρ€Π°Π·Π΄Π΅Π» 11.3.5). ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ equal_range() ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (см. Ρ€Π°Π·Π΄Π΅Π» 10.1). Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для сравнСния элСмСнтов функция equal_range() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ Sales_data Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ compareIsbn() (см. Ρ€Π°Π·Π΄Π΅Π» 11.2.2).

Алгоритм equal_range() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΡ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ элСмСнтов. Если ΠΊΠ½ΠΈΠ³Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π°, Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ окаТутся Ρ€Π°Π²Π½Ρ‹, означая, Ρ‡Ρ‚ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ пуст. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‡Π»Π΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ послС послСднСй.

ИспользованиС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°

ПослС создания Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠ² с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ эти Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ слСдуСт ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΠ±Ρ‰Π΅Π³ΠΎ объСма ΠΏΡ€ΠΎΠ΄Π°ΠΆ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π»Π° такая ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ°:

void reportResults(istream &in, ostream &os,

                   const vector<vector<Sales_data>> &files) {

 string s; // искомая ΠΊΠ½ΠΈΠ³Π°

 while (in >> s) {

  auto trans = findBook(files, s);

  // ΠΌΠ°Π³Π°Π·ΠΈΠ½, ΠΏΡ€ΠΎΠ΄Π°Π²ΡˆΠΈΠΉ эту ΠΊΠ½ΠΈΠ³Ρƒ

  if (trans.empty()) {

   cout << s << " not found in any stores" << endl;

   continue; // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ для поиска

  }

  for (const auto &store : trans) // для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° с

                                  // ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ΅ΠΉ

   // get<n> Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π² store

   os << "store " << get<0>(store) << " sales: "

      << accumulate(get<1>(store), get<2>(store),

         Sales_data(s))

      << endl;

 }

}

Π¦ΠΈΠΊΠ» while ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ istream ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ in, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠ½ΠΈΠ³ΠΈ. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ findBook() позволяСт Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, присутствуСт Π»ΠΈ строка s, ΠΈ присваиваСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ trans. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ написаниС Ρ‚ΠΈΠΏΠ° trans, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto.

Если Π²Π΅ΠΊΡ‚ΠΎΡ€ trans пуст, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΠΎ ΠΊΠ½ΠΈΠ³Π΅ s Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΄Π°ΠΆ Π½Π΅ Π±Ρ‹Π»ΠΎ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС выводится сообщСниС ΠΈ происходит Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊ Ρ†ΠΈΠΊΠ»Ρƒ while, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ.

Π¦ΠΈΠΊΠ» for свяТСт ссылку store с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом Π²Π΅ΠΊΡ‚ΠΎΡ€Π° trans. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнты Π²Π΅ΠΊΡ‚ΠΎΡ€Π° trans Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, объявим ссылку store ссылкой Π½Π° константу. Для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ get: get<0> β€” индСкс ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°; get<1> β€” ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ; get<2> β€” Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ послС послСднСй.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс Sales_data опрСдСляСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ суммы (см. Ρ€Π°Π·Π΄Π΅Π» 14.3), для суммирования Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ accumulate() (см. Ρ€Π°Π·Π΄Π΅Π» 10.2.1). Как ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ суммирования ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Sales_data, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конструктором Sales_data(), ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΌ строку (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.4). Π­Ρ‚ΠΎΡ‚ конструктор ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ bookNo ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ строкой, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ units_sold ΠΈ revenue β€” Π½ΡƒΠ»Π΅ΠΌ.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.4. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ findBook().

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.5. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ findBook() Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΠΏΠ°Ρ€Ρƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ индСкс ΠΈ ΠΏΠ°Ρ€Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.6. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ findBook() Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π½Π΅ использовала ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Ρƒ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.7. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ findBook() Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.8. Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° accumulate() Π² послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° этого Ρ€Π°Π·Π΄Π΅Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Sales_data?