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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор Π”. БтСфСнс

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

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° (Π½Π΅ число символов, Π² Π½Π΅ΠΌ содСрТащихся, Π° Π΅Π³ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€) ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° capacity. Если трСбуСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ reserve ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ числовой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°. Π’Π°ΠΊΠΆΠ΅ имССтся максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° max_size. Π­Ρ‚ΠΎ всС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° расходованиС памяти Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 4.9, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4.9. Π”Π»ΠΈΠ½Π° строки ΠΈ Π΅Π΅ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ

#include <string>

#include <iostream>


using namespace std;


int main() {

 string s = "";

 string sr = "";

 sr.reserve(9000);

 cout << "s.length = " << s.length( ) << '\n';

 cout << "s.capacity = " << s.capacity( ) << '\n';

 cout << "s.max.size = " << s.max_size() << '\n';

 cout << "sr.length = " << sr.length() << '\n';

 cout << "sr.capacity = " << sr.capacity() << '\n';

 cout << "sr.max_size = " << sr.max_size() << '\n';

 for (int i = 0; i < 10000; ++i) {

  if (s.length() == s.capacity()) {

   cout << "s достигла Смкости " << s.length() << ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅... \n";

  }

  if (sr.length() == sr.capacity()) {

   cout << "sr достигла Смкости " << sr.length() << ", ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...\n";

  }

  s += 'x';

  sr += 'x';

 }

}

ΠŸΡ€ΠΈ использовании Visual C++ 7.1 Π²Ρ‹Π²ΠΎΠ΄ выглядит Ρ‚Π°ΠΊ.

s.length = 0

s.capacity = 15

s.max_size = 4294967294

sr.length = 0

sr.capacity = 9007

sr.max_size = 4294967294

s достигла Смкости 15, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 31, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 47, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 70, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 105, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 157, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 235, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 352, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 528, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 792, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 1188, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 1782, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 2673, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 4009, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 6013, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

sr достигла Смкости 9007, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

s достигла Смкости 9019, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅...

Π—Π΄Π΅ΡΡŒ происходит Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΡƒΡ„Π΅Ρ€ строки заполняСтся ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ добавлСния Π² Π½Π΅Π³ΠΎ символов. Если Π±ΡƒΡ„Π΅Ρ€ оказываСтся ΠΏΠΎΠ»ΠΎΠ½ (Ρ‚.Π΅. Π΄Π»ΠΈΠ½Π° = Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ), выдСляСтся Π½ΠΎΠ²Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€, ΠΈ символы ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ строки ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ добавляСмый символ (ΠΈΠ»ΠΈ символы) ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² этот Π½ΠΎΠ²Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€, s Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с Смкости 15 (зависит ΠΎΡ‚ компилятора), Π° Π·Π°Ρ‚Π΅ΠΌ увСличиваСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 50%.

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

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΊΠΎΠ³Π΄Π° потрСбуСтся ΡƒΠ·Π½Π°Ρ‚ΡŒ, пуста Π»ΠΈ строка, Π½Π΅ сравнивайтС Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ с Π½ΡƒΠ»Π΅ΠΌ, Π° просто Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ empty. Π­Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ истину, Ссли Π΄Π»ΠΈΠ½Π° строки Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ.

4.5. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ строк

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ (Ρ€Π΅Π²Π΅Ρ€ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ) строку.

РСшСниС

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ строку Β«Π½Π° мСстС», Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ строки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reverse ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° <algorithm>:

std::reverse(s.begin(), s.end());

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

reverse Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ просто: ΠΎΠ½Π° измСняСт Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ, Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ порядок мСняСтся Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ. ВрСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для этого, Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ зависит ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.

Π’ случаС, Ссли трСбуСтся ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ строку, Π½ΠΎ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС символов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ рСвСрсивныС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠ°ΠΊ здСсь:

std::string s = "Los Angeles";

std::string rs;

rs.assign(s.rbegin(), s.rend());

rbegin ΠΈ rend Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ рСвСрсивныС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. РСвСрсивныС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²Π΅Π΄ΡƒΡ‚ сСбя Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. rbegin Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° послСдний элСмСнт, a rend Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом. Π­Ρ‚ΠΎ Π² точности ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ begin ΠΈ end.

Но Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ строку? Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ rbegin ΠΈ rend для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ строки ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². А Ссли трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск Π² строкС, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ rfind, которая Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ find, Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ с ΠΊΠΎΠ½Ρ†Π° строки ΠΈ двиТСтся ΠΊ Π΅Π΅ Π½Π°Ρ‡Π°Π»Ρƒ. Для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… строк ΠΈΠ»ΠΈ большого количСства строк ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Π½ΡŒ дорогостоящим, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ возмоТности ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ.

4.6. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ строки

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строку с раздСлитСлями Π½Π° нСсколько строк. НапримСр, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строку "Name|Address|Phone" Π½Π° Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… строки β€” "Name", "Address" ΠΈ "Phone", ΡƒΠ΄Π°Π»ΠΈΠ² ΠΏΡ€ΠΈ этом Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ.

РСшСниС

Для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ вхоТдСния раздСлитСля ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ find класса basic_string, Π° для копирования ΠΊΠ°ΠΆΠ΄ΠΎΠΉ подстроки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ substr. Для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π»ΡŽΠ±ΡƒΡŽ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4.10 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ vector.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4.10. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ строки с раздСлитСлями

#include <string>

#include <vector>

#include <functional>

#include <iostream>


using namespace std;


void split(const string& s, char c, vector<string>& v) {

 string::size_type i = 0;

 string::size_type j = s.find(c);

 while (j != string::npos) {

  v.push_back(s.substr(i, j-i));

  i = ++j;

  j = s.find(c, j);

  if (j == string::npos)

   v.push_back(s.substr(i, s.length()));

 }

}


int main() {

 vector<string> v;

 string s = "Account Name|Address 1|Address 2 |City";

 split(s, '|', v);

 for (int i = 0; i < v.size(); ++i) {

  cout << v[i] << '\n';

 }

}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ любой Ρ‚ΠΈΠΏ символов, Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ β€” просто ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΈΠΏ символов ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ случаи использования string Π½Π° basic_string<T>.

template<typename T>

void split(const basic_string<T>& s, T c,

 vector<basic_string<T> >& v) {

 basic_string<T>::size_type i = 0;

 basic_string<T>::size_type j = s.find(c);

 while (j != basic_string<T>::npos) {

  v.push_back(s.substr(i, j-i));

  i = ++j;

  j = s.find(c, j);

  if (j == basic_string<T>::npos)

   v.push back(s.substr(i, s.length()));

 }

}

Π›ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΈ этом Π½Π΅ мСняСтся.

Однако ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя послСдними ΡƒΠ³Π»ΠΎΠ²Ρ‹ΠΌΠΈ скобками Π² послСднСй строкС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ±Π΅Π». Π­Ρ‚ΠΎ трСбуСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига Π²ΠΏΡ€Π°Π²ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4.10 Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ строку с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Начиная с Π½Π°Ρ‡Π°Π»Π° строки, ΠΎΠ½ ΠΈΡ‰Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ раздСлитСля с, Π° Π·Π°Ρ‚Π΅ΠΌ считаСт, Ρ‡Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ стоит послС Π½Π°Ρ‡Π°Π»Π° строки ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ вхоТдСния ΠΈ Π΄ΠΎ этого вхоТдСния, являСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ тСкста. Для поиска ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ вхоТдСния символа Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ строкС string ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ find, Π° для копирования символов Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π² Π½ΠΎΠ²ΡƒΡŽ string, ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌΡƒΡŽ Π² vector, β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ substr. Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² функциях разбиСния строк Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° скриптовых языков ΠΈ являСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ случаСм раздСлСния строки тСкста Π½Π° лСксСмы (tokenizing), описываСмого Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 4.7.

Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ строки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ СдинствСнный символ-Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, являСтся ΠΎΡ‡Π΅Π½ΡŒ распространСнной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, ΠΈ Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Boost String Algorithms. Оно просто Π² использовании. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строку с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ split ΠΈΠ· Boost, посмотритС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 4.11.