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

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

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

Qt ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ элСмСнтам ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°: ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС Java ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС STL. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π² стилС Java Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС STL Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ Qt ΠΈ STL.

Π‘ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ классом—контСйнСром ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС Java: ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°ΠΊ для чтСния, Ρ‚Π°ΠΊ ΠΈ для записи. Классами ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΡΠ²Π»ΡΡŽΡ‚ΡΡ QVectorIterator<T>, QLinkedListIterator<T> ΠΈ QListIterator<T>. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ чтСния—записи ΠΈΠΌΠ΅ΡŽΡ‚ слово Mutable (ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹ΠΉ) Π² ΠΈΡ… Π½Π°Π·Π²Π°Π½ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QMutableVectorIterator<T>). Π’ дальнСйшСм ΠΌΡ‹ основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ списка QList; ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ связанных списков ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс.

Рис. 11.3. ДопустимыС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС Java.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго слСдуСт ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС Java Π½Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ нСпосрСдствСнно Π½Π° элСмСнты. ВмСсто этого ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом, послС послСднСго элСмСнта ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя элСмСнтами. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ с ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ» выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

QList<double> list;

…

QListIterator<double> i(list);

while (i.hasNext()) {

do_something(i.next());

}

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ инициализируСтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ, для ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ использован. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ располагаСтся нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hasNext() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли имССтся элСмСнт справа ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Ѐункция next() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ элСмСнт, располоТСнный справа ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

ΠŸΡ€ΠΎΡ…ΠΎΠ΄ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ выполняСтся Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, с Ρ‚Π΅ΠΌ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ сначала вызываСтся функция toBack() для размСщСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° послС послСднСго элСмСнта.

QListIterator<double> i(list);

i.toBack();

while (i.hasPrevious()) {

do_something(i.previous());

}

Ѐункция hasPrevious() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли имССтся элСмСнт слСва ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°; функция previous() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ элСмСнт, располоТСнный слСва ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π°Π·Π°Π΄ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ взгляд Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ next() ΠΈ previous(): ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚ΠΎΡ‚ элСмСнт, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡˆΠ΅Π» ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€.

Рис. 11.4. ВлияниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ previous() ΠΈ next() Π½Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС Java.

Π”ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ запись ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (mutable iterators) ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для вставки, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ удалСния элСмСнтов Π² Ρ…ΠΎΠ΄Π΅ просмотра ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Π’ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Ρ†ΠΈΠΊΠ»Π΅ ΠΈΠ· списка ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ числа:

QMutableListIterator<double> i(list);

while (i.hasNext()) {

if (i.next() < 0.0)

i.remove();

}

Ѐункция remove() всСгда Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с послСдним ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ элСмСнтом. Она Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ элСмСнтов Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ:

QMutableListIterator<double> i(list);

i.toBack();

while (i.hasPrevious()) {

if (i.previous() < 0.0)

i.remove();

}

Аналогично Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ запись ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС Java ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setValue(), которая ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ послСдний ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ элСмСнт. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ числа ΠΈΡ… Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ:

QMutableListIterator<double> i(list);

while (i.hasNext()) {

int val = i.next();

if (val < 0.0)

i.setValue(-val);

}

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ элСмСнт Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert(). ПослС этого ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ пСрСмСщаСтся Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΎΠ²Ρ‹ΠΌ элСмСнтом ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π·Π° Π½ΠΈΠΌ.

ΠšΡ€ΠΎΠΌΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС Java ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² C<T> ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС STL Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ²: Π‘<Π’>::iterator ΠΈ C<T>::const_iterator. Они ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ const_iterator Π½Π΅ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

Ѐункция ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° begin() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π² стилС STL, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠΉΡΡ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, list[0]), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ функция ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° end() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠΉΡΡ Π½Π° элСмСнт «послС послСднСго элСмСнта» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, list[5] для списка Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 5). Если ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ пустой, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ begin() ΠΈ end() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, хотя для этой Ρ†Π΅Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ isEmpty().

Рис. 11.5. ДопустимыС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС STL.

Бинтаксис примСнСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС STL ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ синтаксис примСнСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π‘++. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ++ ΠΈ β€”β€” для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ элСмСнт, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * для извлСчСния значСния элСмСнта ΠΈΠ· ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Для Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vector<T> Ρ‚ΠΈΠΏΡ‹ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² iterator ΠΈ const_iterator ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ просто ΠΊΠ°ΠΊ typedef для Π’ * ΠΈ const T *. (Π’Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ QVector<T> Ρ…Ρ€Π°Π½ΠΈΡ‚ свои элСмСнты Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… адрСсах памяти.)

Π’ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² спискС QList<double> замСняСтся своим Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ:

QList<double>::iterator i = list.begin();

while (i ! = list.end()) {

*i = qAbs(*i);

++i;

}

НСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Qt Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π² стилС STL, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ копию ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ эту копию. НапримСр, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ слСдуСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ список Ρ‚ΠΈΠΏΠ° QList<int>, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QSplitter::sizes():

QList<int> list = splitter->sizes();

QList<int>::const_iterator i = list.begin();

while (i != list.end()) {

do_something(*i);

++i;

}

НиТС даСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

// ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄

QList<int>::const_iterator i = splitter->sizes().begin();

while (i != splitter->sizes().end()) {

do_something(*i);

++i;

}

Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ функция QSplitter::sizes() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ список QList<int> ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ своСм Π²Ρ‹Π·ΠΎΠ²Π΅. Если ΠΌΡ‹ Π½Π΅ сохраняСм Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π‘++ автоматичСски ΡƒΠ΄Π°Π»ΠΈΡ‚ Π΅Π³ΠΎ Π΅Ρ‰Π΅ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, оставляя Π½Π°ΠΌ «повисший» ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€. Π”Π΅Π»ΠΎ Π΅Ρ‰Π΅ усугубляСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ шагС Ρ†ΠΈΠΊΠ»Π° функция QSplitter::sizes() Π΄ΠΎΠ»ΠΆΠ½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ копию списка ΠΈΠ·-Π·Π° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ splitter->sizes().end(). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² стилС STL, всСгда слСдуСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ копию экзСмпляра ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

ΠŸΡ€ΠΈ использовании ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС Java, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ копию. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ обСспСчит копию Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для нас, гарантируя всСгда просмотр Π² Ρ†ΠΈΠΊΠ»Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. НапримСр:

QListIterator<int> i(splitter->sizes());

while (i.hasNext()) {

do_something(i.next());

}

ПодобноС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСэффСктивным, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ ΠΈΠ·-Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ посрСдством Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ нСявного совмСстного использования даннъис (implicit sharing). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ опСрация копирования Qtβ€”ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° выполняСтся ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ быстро, ΠΊΠ°ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ указатСля. Волько Ссли скопированная строка измСняСтся, Ρ‚ΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ β€” ΠΈ всС это дСлаСтся автоматичСски ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ нСявноС совмСстноС использованиС ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Β«ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈ записи» (copy on write).

ΠŸΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ нСявного совмСстного использования Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эта оптимизация выполняСтся Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Π½Π΅ΠΉ; ΠΎΠ½Π° просто Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сама ΠΏΠΎ сСбС ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ нас ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя нСявноС совмСстноС использованиС Π΄Π°Π½Π½Ρ‹Ρ… способствуСт Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ программист слСдуСт Ρ‡Π΅Ρ‚ΠΊΠΎΠΌΡƒ ΡΡ‚ΠΈΠ»ΡŽ, возвращая всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

01 QVector<double> sineTable()

02 {

03 QVector<double> vect(360);

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

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

06 return vect;

07 }

Π’Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

QVector<double> table = sineTable();

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