строки | |
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
.
#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 показывает простой образец.
#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
— это динамическая последовательность объектов, которая предоставляет