string strSTLString ("Hello String");
// Доступ к содержимому строки с использованием
синтаксиса массива
cout«"Displaying the elements in the string using array-syntax:"
endl;
for ( size_t nCharCounter = 0
;nCharCounter < strSTLString.length ()
;++ nCharCounter )
{
cout « "Character [" « nCharCounter « "] is: ";
cout « strSTLString [nCharCounter] « endl;
394 ЗАНЯТИЕ 16. Классы строк библиотеки STL
}
cout « endl;
2 0 :
// Доступ к содержимому строки с использованием итератора
cout « "Displaying the contents of the string using iterators: "
endl;
int charOffset = 0;
string::const_iterator iCharacterLocator;
for ( iCharacterLocator = strSTLString.begin ()
; iCharacterLocator !- strSTLString.end ()
; ++ iCharacterLocator )
{
cout « "Character [" « charOffset ++ « "] is: ";
cout « ^iCharacterLocator « endl;
}
cout « endl;
33:
// Обращение к содержимому строки в стиле С
cout « "The char* representation of the string is: ";
cout « strSTLString.c_str () « endl;
37:
return 0;
}
Результат
Displaying the elements in the string using array-syntax:
Character [0] is: H
Character [1] is: e
Character [2] is: 1
Character [3] is: 1
Character [4] is: 0
Character [5] is:
Character [6] is: S
Character [7] is: t
Character [8] is: r
Character [9] is: i
Character [10] is:: n
Character [11] is: g
Displaying the contents of the string using iterators:
Character
|
[0]
|
is: H
|
Character
|
[1]
|
is: e
|
Character
|
[2]
|
is: 1
|
Character
|
[3]
|
is: 1
|
Character
|
[4]
|
is: 0
|
Character
|
[5]
|
is:
|
Character
|
[6]
|
is: S
|
Character
|
[7]
|
is: t
|
Character
|
[8]
|
is: r
|
Character
|
[9]
|
is: i
|
Character
|
[10]
|
is: n
|
Character
|
[11]
|
is: g
|
The char*
|
representation of the string is: Hello String
|
Работа с классами строк библиотеки STL
|
395
|
Анализ
Код отображает несколько способов обращения к содержимому строки. Итераторы важны в том смысле, что большинство функций-членов класса s t r i n g возвращают свои результаты в форме итераторов. Строки 12-18 отображают символы строки с использова нием реализованного классом s t d : : s t r i n g оператора индексирования [ ], как у массива. Обратите внимание, что этому оператору нужно предоставить смещение, как можно за метить в строке 17. Поэтому очень важно не пересечь границы строки, т.е. вы не должны читать символы по смещению больше длины строки. Строки 25-31 также отображают содержимое посимвольной строки, но с использованием итератора.
Конкатенация строк
Конкатенация строк может быть осущ ествлена либо при помощи оператора +=, либо функции-члена a p p e n d ():
string strSamplel ("Hello");
string strSample2 (" String!");
strSamplel += strSample2; // использование std::string::operator+=
альтернативно используется std::string::append() strSamplel.append (strSample2); // (перегружен также для char*)
Листинг 16.3 демонстрирует применение этих двух вариантов.
Л И СТИ Н Г 1 6 .3 . Конкатенация строк с использованием оператора
сложения с присвоением (+=) или метода append ()____________________________________
#include
#include
2 :
int main ()
{
using namespace std;
6 :
string strSamplel ("Hello");
string strSample2 (" String!");
// Конкатенация
strSamplel += strSample2;
cout « strSamplel « endl « endl;
string strSample3 (" Fun is not needing to use pointers!");
strSamplel.append (strSample3);
cout « strSamplel « endl « endl;
17:
const char* constCStyleString = " You however still can!";
strSamplel.append (constCStyleString);
20: cout « strSamplel « endl;
2 1 :
2 2 : return 0;
23: }
396 ЗАНЯТИЕ 16. Классы строк библиотеки STL
Результат
Hello String!
Hello String! Fun is not needing to use pointers!
Hello String! Fun is not needing to use pointers! You however still can!
Анализ
Строки 11, 15 и 19 отображают различные способы конкатенации строк STL. Обратите внимание на использование оператора += и возможность функции ap p e n d (), у которой есть множество перегруженных версий, получать другие строковые объекты (как показано в строке 11) и символьные строки в стиле С.
Поиск символа или подстроки в строке
Класс s t r i n g библиотеки STL предоставляет функцию -член f i n d () в нескольких перегруженных версиях. Она позволяет найти символ или подстроку в данном объекте класса s t r i n g .
Найти подстроку "day" в строке strSample, начиная с позиции О size_t charPos = strSample.find ("day", 0);
Удостовериться, что подстрока найдена, сравнив со string::npos if (charPos != string::npos)
cout « "First instance of \"day\" was found at position "
charPos;
else
cout « "Substring not found." « endl;
Листинг 16.4 демонстрирует удобство метода s t d : : s t r i n g : : f i n d ().
ЛИСТИНГ 16.4, Использование метода string: :find() для поиска подстроки или символа
#include
#include
2 :
int main ()
{
using namespace std;
6 :
string strSample ("Good day String! Today is beautiful!");
8:
|
cout «
|
"The samplestring is: " « endl;
|
9:
|
cout «
|
strSample« endl « endl;
|
10:
|
|
|
// Найти в ней подстроку "day"...
size_t charPos = strSample.find ("day", 0);
// Удостовериться, что подстрока найдена...
if (charPos != string::npos)
16: cout « "First instance of \"day\" was found at position "
charPos;
Работа с классами строк библиотеки STL
|
397
|
else
cout « "Substring not found." « endl;
20:
|
cout
|
«
|
endl « endl;
|
2 1 :
|
cout
|
«
|
"Locating all instances ofsubstring \"day\"" « endl;
|
22:
|
23:
|
size_t
|
SubstringPos = strSample.find ("day", 0);
|
24:
|
|
|
|
while (SubstringPos !=string::npos)
{
cout « "\"day\" found at position " « SubstringPos « endl;
// Продолжить поиск вперед, от следующего символа
size_t nSearchPosition = SubstringPos + 1;
31:
SubstringPos = strSample.find ("day", nSearchPosition);
}
34:
cout « endl;
cout « "Locating all instances of character 'a'" « endl;
const charcharToSearch = 'a';
charPos = strSample.find (charToSearch, 0);
40:
while (charPos !=string::npos)
{
cout « "'" « charToSearch « "' found";
cout « " at position: " « charPos « endl;
46: // Продолжить поиск вперед, от следующегосимвола
size_t charSearchPos = charPos + 1;
charPos = strSample.find (charToSearch, charSearchPos);
}
51:
return 0;
}
Результат
The sample string is:
Good day String! Today is beautiful!
Do'stlaringiz bilan baham: |