строки
trim_left_copy trim_right_copy Работает как trim_сору, но только для левого или правого конца строки
trim_left_copy_if trim_right_copy_if Работает как trim_copy_if, но только для левого или правого конца строки. Обе функции имеют две версии — одна работает с последовательностью, а другая — с коллекцией

Первые четыре шаблона функции, описанные в табл. 4.1, — это базовая функциональность функций обрезки библиотеки String Algorithms. Остальные являются вариациями на их тему. Чтобы увидеть некоторые из них в действии, посмотрите на пример 4.5. Он показывает некоторые преимущества от использования этих функций перед методами string.

Пример 4.5. Использование функций обрезки строк Boost

#include <iostream>

#include <string>

#include <boost/algorithm/string.hpp>

using namespace std;

using namespace boost;

int main() {

 string s1 = ' ведущие пробелы?';

 trim_left(s1); // Обрезка оригинальной строки

 string s2 = trim_left_copy(s1); // Обрезка, но оригинал остается без изменений

 cout << 's1 = ' << s1 << endl;

 cout << 's2 = ' << s2 << endl;

 s1 = 'YYYYboostXXX';

 s2 = trim_copy_if(s1, is_any_of('XY')); // Используется предикат

 trim_if(s1, is_any_of('XY'));

 cout << 's1 = ' << s1 << endl;

 cout << 's2 = ' << s2 << endl;

 s1 = '1234 числа 9876';

 s2 = trim_copy_if(s1, is_digit());

 cout << 's1 = ' << s1 << endl;

 cout << 's2 = ' << s2 << endl;

 // Вложенные вызовы функций обрезки

 s1 = ' ****Обрезка!*** ';

 s2 = trim_copy_if(trim_copy(s1), is_any_of('*'));

 cout << 's1 = ' << s1 << endl;

 cout << 's2 = ' << s2 << endl;

}

Пример 4.5 демонстрирует, как использовать функции обрезки строк Boost. Обычно способ их использования понятен из их названия, так что я не буду вдаваться в описания более подробные, чем даны в табл. 4.1. Единственная функция, имеющаяся в этом примере и отсутствующая в таблице, — это is_any_of. Это шаблон функции, который возвращает объект функции-предиката, используемый функциями серии trim_if. Она используется, когда требуется обрезать набор символов. Также есть аналогичная функция классификации, которая называется is_from_range и принимает два аргумента и возвращает унарный предикат, который возвращает истину, когда символ находится в заданном диапазоне. Например, чтобы обрезать в строке символы с а до d, требуется сделать что-то, похожее на следующее.

s1 = 'abcdXXXabcd';

trim_if(s1, is_from_range('a', 'd'));

cout << 's1 = ' << s1 << endl; // Теперь s1 = XXX

Заметьте, что эта конструкция чувствительна к регистру, так как диапазон от а до d не включает заглавных версий этих букв.

4.3. Хранение строк в последовательности

Проблема

Требуется сохранить набор строк в виде последовательности, которая ведет себя как массив.

Решение

Для хранения строк в виде массива используйте vector. Пример 4.6 показывает простой образец.

Пример 4 6. Хранение строк в векторе

#include <string>

#include <vector>

#include <iostream>

using namespace std;

int main() {

 vector<string> v;

 string s = 'one';

 v.push_back(s);

 s = 'two';

 v.push_back(s);

 s = 'three';

 v.push_back(s);

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

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

 }

}

vector использует для произвольного доступа семантику массива (а также делает много другого), так что он прост и понятен в использовании. Однако vector — это только одна из многих последовательностей стандартной библиотеки. Чтобы узнать об этом побольше, читайте дальше.

Обсуждение

vector — это динамическая последовательность объектов, которая предоставляет

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату