Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

В

StringTokenizer
можно внести пару усовершенствований. Во-первых, для простоты
StringTokenizer
написан так, что он работает только с простыми строками — другими словами, строками из узких символов. Если требуется, чтобы один и тот же класс работал как с узкими, так и с широкими символами, параметризуйте тип символов, как это сделано в предыдущих рецептах. Другим улучшением является расширение
StringTokenizer
так, чтобы он обеспечивал более дружественное взаимодействие с последовательностями и был более гибок. Вы всегда можете сделать это сами, а можете использовать имеющийся класс разбиения на лексемы. Проект Boost содержит
класс
tokenizer
, делающий все это. За подробностями обратитесь к www.boost.org.

Смотри также

Рецепт 4.24.

4.8. Объединение нескольких строк

Проблема

Имея последовательность строк, такую как вывод примера 4.10, вам требуется объединить их в одну длинную строку, возможно, с разделителями.

Решение

В цикле переберите всю последовательность строк и добавьте каждую из них в выходную строку. В качестве входа можно обрабатывать любую стандартную последовательность. Пример 4.13 использует

vector
из элементов типа
string
.

Пример 4.13. Объединение последовательности строк

#include <string>

#include <vector>

#include <iostream>

using namespace std;

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

 s.clear;

 for (vector<string>::const_iterator p = v.begin;

p ! = v.end; ++p) {

s += *p;

if (p != v.end - 1) s += c;

 }

}

int main {

 vector<string> v;

 vector<string> v2;

 string s;

 v.push_back(string("fее"));

 v.push_back(string("fi"));

 v.push_back(string("foe"));

 v.push_back(string("fum"));

 join(v, '/', s);

 cout << s << '\n';

}

Обсуждение

Пример 4.13 содержит одну методику, которая несколько отличается от предыдущие примеров. Посмотрите на эту строку.

for (vector<string>::const_iterator p = v.begin;

Предыдущие примеры работы со строками использовали

iterator
'ы без части «const», но здесь без этого не обойтись, так как
v
объявлен как ссылка на объект
const
. Если имеется объект контейнера
const
, то для доступа к его элементам можно использовать только
const_iterator
. Это так потому, что простой
iterator
позволяет записывать в объект, на который он указывает, что, конечно, нельзя делать в случае с объектами контейнера типа
const
.

v
объявлен как
const
по двум причинам. Во-первых,
я знаю, что я не собираюсь изменять его содержимое, так что я хочу, чтобы компилятор выдал сообщение об ошибке, если это произойдет. Компилятор гораздо лучше меня в деле поиска таких вещей, особенно когда к такому присвоению приводит тонкая семантическая или синтаксическая ошибка. Во-вторых, я хочу показать пользователям этой функции, что я ничего не делаю с их контейнером, и
const
— это великолепный способ сделать это. Теперь я просто должен создать обобщенную версию, которая работает с различными типами символов.

Как и в рецепте 4.6, превращение

join
в общий шаблон функции очень просто. Все, что требуется сделать, — это изменить заголовок, параметризовав тип символов, как здесь:

template<typename T>

void join(const std::vector<std::basic_string<T> >& v, T c,

 std::basic_string<T>& s)

Но

vector
может оказаться не единственным возможным входом функции. Вам может потребоваться объединить строки в стиле С. Класс
string
C++ предпочтительнее строк в стиле С, так что если возникает такая задача, объединяйте их в C++
string
. После этого всегда можно получить версию С, вызвав метод
string c_str
, который возвращает указатель
const
на завершающийся нулем массив символов.

Пример 4.14 предлагает общую версию

join
, которая объединяет массив символов в
string
. Так как новая общая версия параметризована по типу символов, она будет работать как для массивов узких, так и для массивов широких символов.

Пример 4.14 Объединение строк в стиле C

#include <string>

#include <iostream>

const static int MAGIC_NUMBER = 4;

template<typename T>

void join(T* arr[], size_t n, T c, std::basic_string<T>& s) {

 s.clear;

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

if (arr[i] != NULL)

s += arr[i];

if (i < n-1) s += c;

 }

}

int main {

 std::wstring ws;

 wchar_t* arr[MAGIC_NUMBER];

 arr[0] = L"you";

 arr[1] = L"ate";

 arr[2] = L"my";

 arr[3] = L"breakfast";

 join(arr, MAGIC_NUMBER, L'/', ws);

}

4.9. Поиск в строках

Проблема

Требуется выполнить поиск в строке. Это может быть поиск одного символа, другой строки или одного из (или одного не из) неупорядоченного набора символов. И по каким-либо причинам требуется выполнять поиск в определенном порядке, например первое или последнее вхождение или первое или последнее вхождения относительно какого- либо положения в строке.

Поделиться:
Популярные книги

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Неудержимый. Книга XVI

Боярский Андрей
16. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVI

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Девочка-лед

Джолос Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка-лед

Сотник

Ланцов Михаил Алексеевич
4. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Сотник

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Новые горизонты

Лисина Александра
5. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Новые горизонты

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Скандальный развод, или Хозяйка владений "Драконье сердце"

Милославская Анастасия
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Скандальный развод, или Хозяйка владений Драконье сердце

Курсант: Назад в СССР 7

Дамиров Рафаэль
7. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 7

Шериф

Астахов Евгений Евгеньевич
2. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.25
рейтинг книги
Шериф