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

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

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

Ѐункция reserve() Π½Π΅ измСняСт количСство элСмСнтов Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅; ΠΎΠ½Π° влияСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° объСм памяти, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reserve() измСняСт Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ пространство ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ. Если Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ большС Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Смкости, функция reserve() Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ мСста, сколько Π·Π°Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΎ (ΠΈΠ»ΠΈ нСсколько большС).

Если Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π΅Π½ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Смкости, функция reserve() Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. Π’ частности, Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reserve(), ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ мСньшСм, Ρ‡Π΅ΠΌ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ, Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ памяти. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reserve() Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌΡƒ Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reserve() Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ сократит объСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ функция-Ρ‡Π»Π΅Π½ resize() (см. Ρ€Π°Π·Π΄Π΅Π» 9.3.5) измСняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство элСмСнтов ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π° Π½Π΅ Π΅Π³ΠΎ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ. Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ resize() нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для сокращСния объСма ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π΄Π΅Ρ€ΠΆΠΈΡ‚ Π² Ρ€Π΅Π·Π΅Ρ€Π²Π΅.

Π’ Π½ΠΎΠ²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π΅ΡΡ‚ΡŒ функция shrink_to_fit(), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ deque, vector ΠΈΠ»ΠΈ string ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ Смкости большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Однако рСализация ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот запрос. НСт Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shrink_to_fit() освободит ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ capacity() ΠΈ size()

ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ (capacity) ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ (size). Π Π°Π·ΠΌΠ΅Ρ€ β€” это количСство элСмСнтов, хранящихся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π° Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ β€” это количСство элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ, Π½Π΅ прибСгая ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ рСзСрвирования памяти. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ взаимосвязь Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Смкости:

vector<int> ivec;

// Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ; Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

cout << "ivec: size: " << ivec.size()

     << " capacity: " << ivec.capacity() << endl;

// ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ ivec 24 элСмСнта

for (vector<int>::size_type ix = 0; ix != 24; ++ix)

 ivec.push_back(ix);


// Ρ€Π°Π·ΠΌΠ΅Ρ€ 24; Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° ΠΈΠ»ΠΈ большС 24, согласно Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

cout << "ivec: size: " << ivec.size()

     << " capacity: " << ivec.capacity() << endl;

ΠŸΡ€ΠΈ запускС Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Π°Π²Ρ‚ΠΎΡ€Π° эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ»Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ivec: size: 0 capacity: 0

ivec: size: 24 capacity: 32

Как извСстно, пустой Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для пустого Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСт Π½ΡƒΠ»Π΅Π²ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ элСмСнтов Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ составляСт количСство Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… элСмСнтов. Π•ΠΌΠΊΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ большС. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ объСм Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ Смкости зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ 24 элСмСнтов ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ созданию Смкости 32.

Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ivec ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:


Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reserve() ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство.

ivec.reserve(50); // Π·Π°Π΄Π°Ρ‚ΡŒ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ 50 элСмСнтов (ΠΌΠΎΠΆΠ½ΠΎ ΠΈ большС)

// Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ 24, Π° Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ - 50 ΠΈΠ»ΠΈ большС, Ссли Ρ‚Π°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ

// Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

cout << "ivec: size: " << ivec.size()

     << " capacity: " << ivec.capacity() << endl;

Π’Ρ‹Π²ΠΎΠ΄ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reserve() Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π» ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ мСста, сколько Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ:

ivec: size: 24 capacity: 50

Π­Ρ‚Ρƒ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ впослСдствии ΠΈΠ·Ρ€Π°ΡΡ…ΠΎΠ΄ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

// Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΡ‡Π΅Ρ€ΠΏΠ°Ρ‚ΡŒ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ

while (ivec.size() != ivec.capacity())

 ivec.push_back(0);

// Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Π½Π΅ измСнилась, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π²Π½Ρ‹

cout << "ivec: size: " << ivec.size()

     << " capacity: " << ivec.capacity() << endl;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ рСзСрвная Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ исчСрпана, Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Ρ‹.

ivec: size: 50 capacity: 50

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ использовалась Ρ‚ΠΎΠ»ΡŒΠΊΠΎ рСзСрвная Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ, Π² ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ потрСбности. ЀактичСски, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости Π² пСрСраспрСдСлСнии Π΅Π³ΠΎ элСмСнтов Π½Π΅Ρ‚.

Если Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт, Ρ‚ΠΎ послСдуСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ памяти.

ivec.push_back(42); // Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ элСмСнт

// Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ 51, Π° Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ 51 ΠΈΠ»ΠΈ большС, Ссли Ρ‚Π°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ

// Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

cout << "ivec: size: " << ivec.size()

     << " capacity: " << ivec.capacity() << endl;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этой части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

ivec: size: 51 capacity: 100

Он ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса vector использована стратСгия удвоСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Смкости ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ области памяти.

По ΠΌΠ΅Ρ€Π΅ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ shrink_to_fit(), Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ освобоТдСниС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС памяти, Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

ivec.shrink_to_fit(); // запрос Π½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ памяти

// Ρ€Π°Π·ΠΌΠ΅Ρ€ остался Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ; Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ

cout << "ivec: size: " << ivec.size()

     << " capacity: " << ivec.capacity() << endl;

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shrink_to_fit() являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ запросом; Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π°.

КаТдая рСализация ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° vector ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ рСзСрвирования. Однако Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ памяти Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Π½Π΅ исчСрпана.

Π’Π΅ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС выполнСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вставки, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π²Π΅Π½ Смкости, Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ resize() ΠΈΠ»ΠΈ reserve() со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ памяти, Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ ΡΠ²Ρ‹ΡˆΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ объСма, зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

КаТдая рСализация обязана ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ стратСгии, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ эффСктивноС использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ push_back() ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ элСмСнтов Π² Π²Π΅ΠΊΡ‚ΠΎΡ€. Π‘ тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния врСмя создания n элСмСнтов Π²Π΅ΠΊΡ‚ΠΎΡ€Π° составляСт врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ push_back() для ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ пустого Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π° n.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.35. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.36. ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ, ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ, Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.37. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ list ΠΈ array Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° capacity()?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.38. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ рост Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.39. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

vector<string> svec;

svec.reserve(1024);

string word;

while (cin >> word)

 svec.push_back(word);

svec.resize(svec.size() + svec.size()/2);

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.40. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ 256 слов, ΠΊΠ°ΠΊΠΎΠ²Π° Π΅Π΅ вСроятная Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ resize()? Π§Ρ‚ΠΎ, Ссли ΠΎΠ½Π° Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ 512, 1 000 ΠΈΠ»ΠΈ 1 048 слов?

9.5. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со строками

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

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° string опрСдСляСт мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ количСства обсуТдаСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ этот Ρ€Π°Π·Π΄Π΅Π» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слишком Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ; поэтому сначала Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ. ВпослСдствии, имСя прСдставлСниС ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄Π°Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ нСобходимости Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ подробности использования ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

9.5.1. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ способы создания строк

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ конструкторам, описанным Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 3.2.1, ΠΈ конструкторам, ΠΎΠ±Ρ‰ΠΈΠΌ для всСх ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² (см. Ρ‚Π°Π±Π». 9.3), Ρ‚ΠΈΠΏ string прСдоставляСт Π΅Ρ‰Π΅ Ρ‚Ρ€ΠΈ конструктора, описанныС Π² Ρ‚Π°Π±Π». 9.11.


Π’Π°Π±Π»ΠΈΡ†Π° 9.11. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ способы создания строк 

ВсС значСния n, len2 ΠΈ pos2 ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ. string s(cp, n); Π‘Ρ‚Ρ€ΠΎΠΊΠ° s β€” копия ΠΏΠ΅Ρ€Π²Ρ‹Ρ… n символов ΠΈΠ· массива, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ cp. Π£ Ρ‚ΠΎΠ³ΠΎ массива Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ n символов string s(s2, pos2); Π‘Ρ‚Ρ€ΠΎΠΊΠ° s β€” копия символов ΠΈΠ· строки s2, начиная с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠΎ индСксу pos2. Если pos2 > s2.size(), Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нСпрСдсказуСм string s(s2, pos2, len2); Π‘Ρ‚Ρ€ΠΎΠΊΠ° s β€” копия len2 символов ΠΈΠ· строки s2, начиная с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠΎ индСксу pos2. Если pos2 > s2.size(), Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нСпрСдсказуСм. НСзависимо ΠΎΡ‚ значСния len2, копируСтся ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ s2.size() - pos2 символов

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏ string ΠΈΠ»ΠΈ const char*, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅) Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‚ΡŒ количСство ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… символов. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ строки ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ индСкс Π½Π°Ρ‡Π°Π»Π° копирования: