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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 65

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, STL склоняСт нас ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π² Π²ΠΈΠ΄Π΅ нСконстантной ссылки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ копирования, происходящСго ΠΈΠ·-Π·Π° возвращСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ значСния, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

01 using namespace std;

02 void sineTable(vector<double> &vect)

03 {

04 vect.resize(360);

05 for (int i = 0; i < 360; ++i)

06 vect[i] = sin(i / (2 * M_PI));

07 }

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ простым ΠΈ ΠΌΠ΅Π½Π΅Π΅ понятным:

vector<double> table;

sineTable(table);

Π’ Qt примСняСтся нСявноС совмСстноС использованиС Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎ всСх Π΅Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… классах, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ QByteArray, QBrush, QFont, QImage, QPixmap ΠΈ QString. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этих классов ΠΎΡ‡Π΅Π½ΡŒ эффСктивным ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… функциями Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

НСявноС совмСстноС использованиС Π΄Π°Π½Π½Ρ‹Ρ… Π² Qt Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли ΠΌΡ‹ ΠΈΡ… Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π³ΠΎΠ΄Ρ‹ ΠΎΡ‚ примСнСния этой Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² сСбС Π΄Π²Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Одна связана с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ at() вмСсто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° [ ] ΠΏΡ€ΠΈ доступС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΊ (нСконстантному) Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ ΠΈΠ»ΠΈ списку. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Qtβ€”ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² нСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, оказываСтся Π»ΠΈ [ ] с Π»Π΅Π²ΠΎΠΉ стороны ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания ΠΈΠ»ΠΈ Π½Π΅Ρ‚, прСдполагаСтся самоС Ρ…ΡƒΠ΄ΡˆΠ΅Π΅ ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выполняСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (deep сору), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ at() Π½Π΅ допускаСтся Π² Π»Π΅Π²ΠΎΠΉ части ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания.

Подобная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС STL. Когда Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ begin() ΠΈΠ»ΠΈ end() для нСконстантного ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Qt всСгда ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выполняСт Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ совмСстном использовании Π΄Π°Π½Π½Ρ‹Ρ…. РСшСниС, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этой нСэффСктивности, состоит Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ возмоТности const_iterator, constBegin() ΠΈ constEnd().

Π’ Qt прСдусмотрСн Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½, послСдний ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ элСмСнтам ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° β€” ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ†ΠΈΠΊΠ»Π° foreach. Он выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

QLinkedList<Movie> list;

…

foreach (Movie movie, list) {

if (movie.title() == "Citizen Kane") {

cout << "Found Citizen Kane" << endl;

break;

}

}

ΠŸΡΠ΅Π²Π΄ΠΎΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово foreach рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартного Ρ†ΠΈΠΊΠ»Π° for. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Ρ†ΠΈΠΊΠ»Π° пСрСмСнная Ρ†ΠΈΠΊΠ»Π° (movie) устанавливаСтся Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ Π·Π°Ρ‚Π΅ΠΌ двигаясь Π²ΠΏΠ΅Ρ€Π΅Π΄. Π¦ΠΈΠΊΠ» foreach автоматичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ копию ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Ρ†ΠΈΠΊΠ», ΠΈ ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² Ρ…ΠΎΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π° Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° сам Ρ†ΠΈΠΊΠ».

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ†ΠΈΠΊΠ»Π° break ΠΈ continue. Если Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ скобки. Как ΠΈ для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° for, пСрСмСнная Ρ†ΠΈΠΊΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π²Π½Π΅ Ρ†ΠΈΠΊΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

QLinkedList<Movie> list;

Movie movie;

…

foreach (movie, list) {

if (movie.title() == "Citizen Kane") {

cout << "Found Citizen Kane" << endl;

break;

}

}

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†ΠΈΠΊΠ»Π° Π²Π½Π΅ Ρ†ΠΈΠΊΠ»Π° β€” СдинствСнная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², содСрТащих Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… с запятой (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QPair<QString, int>).

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСявноС совмСстноС использованиС Π΄Π°Π½Π½Ρ‹Ρ…

НСявноС совмСстноС использованиС Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ автоматичСски ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, поэтому Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для обСспСчСния этой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ хочСтся Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ скрываСтся ΠΎΡ‚ нашСго внимания. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ строки Ρ‚ΠΈΠΏΠ° QString β€” ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… нСявно совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Qt—классов:

QString str1 = "Humpty";

QString str2 = str1;

ΠœΡ‹ присваиваСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str1 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«HumptyΒ» (Humpty-Dumpty β€” Π¨Π°Π»Ρ‚Π°ΠΉβ€”Π‘ΠΎΠ»Ρ‚Π°ΠΉ) ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ str2 ΠΏΡ€ΠΈΡ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str1. К этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QString ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти. ΠšΡ€ΠΎΠΌΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… эта структура Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ счСтчик ссылок, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, сколько строк QString ссылаСтся Π½Π° ΠΎΠ΄Π½Ρƒ структуру Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, счСтчик ссылок Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2.

str2[0] = 'D';

Когда ΠΌΡ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ str2, выполняСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ str1 ΠΈ str2 ΡΡΡ‹Π»Π°Π»ΠΈΡΡŒ Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ измСнСнию ΠΈΡ… собствСнных ΠΊΠΎΠΏΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ссылок Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str1 (Β«HumptyΒ») ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, ΠΈ счСтчик ссылок Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str2 (Β«DumptyΒ») Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 счСтчика ссылок ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ совмСстно.

str2.truncate(4);

Если ΠΌΡ‹ снова ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ str2, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ копирования Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ счСтчик ссылок Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str2 ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1. Ѐункция truncate() нСпосрСдствСнно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str2, возвращая Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ строку Β«DumpΒ». Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ссылок ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1.

str1 = str2;

Когда ΠΌΡ‹ присваиваСм строку str2 строкС str1, счСтчик ссылок для Π΄Π°Π½Π½Ρ‹Ρ… str1 сниТаСтся Π΄ΠΎ 0 ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ никакая строка Ρ‚ΠΈΠΏΠ° QString Π½Π΅ содСрТит значСния Β«HumptyΒ». ΠŸΠ°ΠΌΡΡ‚ΡŒ освобоТдаСтся. ОбС строки QStrings Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«DumpΒ», счСтчик ссылок ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2.

Часто Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ совмСстного использования Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΈΠ·-Π·Π° условий Π³ΠΎΠ½ΠΎΠΊ ΠΏΡ€ΠΈ доступС ΠΊ счСтчикам ссылок. Π’ Qt этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚. ΠšΠ»Π°ΡΡΡ‹β€”ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ инструкции ассСмблСра ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со счСтчиками. Π­Ρ‚Π° тСхнология доступна ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Qt Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ классов QSharedData ΠΈ QSharedDataPointer.

АссоциативныС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹

Ассоциативный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ содСрТит ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство элСмСнтов ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, индСксируСмых Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Qt содСрТит Π΄Π²Π° основных класса ассоциативных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²: QΠœΠ°Ρ€<К, T> ΠΈ QHash<K, T>.

QMap<K, T> β€” это структура Π΄Π°Π½Π½Ρ‹Ρ…, которая содСрТит ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡β€”Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, упорядочСнныС ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Вакая организация Π΄Π°Π½Π½Ρ‹Ρ… обСспСчиваСт Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ поиска ΠΈ вставки, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² порядкС ΠΈΡ… сортировки. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ QMap<K, T> рСализуСтся ΠΊΠ°ΠΊ слоСный список (skipβ€”list).

Рис. 11.6. Ассоциативный массив, ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ QString с int.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ способ вставки элСмСнтов Π² ассоциативный массив состоит Π² использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert():

QMap<QString, int> map;

map.insert("eins", 1);

map.insert("sieben", 7);

map.insert("dreiundzwanzig", 23);

МоТно ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ β€” просто ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ:

map["eins"] = 1;

map["sieben"] = 7;

map["dreiundzwanzig"] = 23;

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

int val = map.value("dreiundzwanzig");

Если ΠΊΠ»ΡŽΡ‡ отсутствуСт Π² ассоциативном массивС, возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, создаваСмоС стандартным конструктором Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Для Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ возвращаСтся Π½ΡƒΠ»ΡŒ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ value(), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

int seconds = map.value("delay", 30);

Π­Ρ‚ΠΎ эквивалСнтно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ:

int seconds = 30;

if (map.contains("delay"))

seconds = map.value("delay");

Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… К ΠΈ T Π² ассоциативном массивС QMap<K, T> ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, int ΠΈ double), ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ стандартный конструктор, конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚ΠΈΠΏ К Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ operator < (), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ QMap<K, T> примСняСт Π΅Π³ΠΎ для хранСния элСмСнтов Π² порядкС возрастания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

Класс QMap<K, T> ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, keys() ΠΈ values(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с нСбольшими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Они Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ списки Ρ‚ΠΈΠΏΠ° QList ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ассоциативного массива.