Д. Стефенс - C++. Сборник рецептов
- Название:C++. Сборник рецептов
- Автор:
- Жанр:
- Издательство:КУДИЦ-ПРЕСС
- Год:2007
- Город:Москва
- ISBN:5-91136-030-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Д. Стефенс - C++. Сборник рецептов краткое содержание
Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.
C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Пример 4.2. Обрезка символов строки
#include
#include
// Подход для строк из узких символов
void rtrim(std::string& s, char с) {
if (s.empty()) return;
std::string::iterator p;
for (p = s.end(); p != s.begin() && *--p == c;);
if (*p != c) p++;
s.erase(p, s.end());
}
int main() {
std::string s = "zoo";
rtrim(s, 'o');
std::cout << s << '\n';
}
Пример 4.2 выполняет все необходимое для строк длины char
, но работает только для них. Аналогично тому, что показано в примере 4.1, можно использовать общий дизайн basic_string
и шаблон функции. Пример 4.3 использует для удаления символов в конце строки любого типа шаблон функции.
Пример 4.3. Обобщенная версия rtrim
#include
#include
using namespace std;
// Общий подход к обрезке отдельных
// символов строки
template
void rtrim(basic_string& s, T с) {
if (s.empty()) return;
typename basic_string::iterator p;
for (p = s.end(); p != s.begin() && *--p == c;);
if (*p != c) p++;
s.erase(p, s.end());
}
int main() {
string s = "Great!!!!";
wstring ws = L"Super!!!!";
rtrim(s, '!');
rtrim(ws, L'!');
cout << s << '\n';
wcout << ws << L'\n';
}
Эта функция работает точно так же, как и предыдущая, необобщенная версия из примера 4.2, но так как она параметризована по типу символов, она будет работать для basic_string
любого типа.
Примеры 4.2 и 4.3 удаляют из строки последовательность одного символа. Однако обрезка пробелов выглядит по-другому, так как пробельный символ может быть представлен одним из нескольких символов. Для удобства стандартная библиотека предоставляет простейший способ справиться с этим: функцию isspace
из заголовочного файла (и ее wchar_t
-эквивалент iswspace
из ). Пример 4.4 определяет общую функцию, которая обрезает концевые пробелы.
Пример 4.4. Удаление концевых пробелов
#include
#include
#include
#include
using namespace std;
template
void rtrimws(basic_string& s, F f) {
if (s.empty()) return;
typename basic_string::iterator p;
for (p = s.end(); p ! = s.begin() && f(*--p););
if (!f(*p))
p++;
s.erase(p, s.end());
}
// Перегрузка для облегчения вызовов в клиентском коде
void rtrimws(string& s) {
rtrimws(s, isspace);
}
void rtrimws(wstring& ws) {
rtrimws(ws, iswspace);
}
int main() {
string s = "zing ";
wstring ws = L"zong ";
rtrimws(s) rtrimws(ws);
cout << s << "|\n";
wcout << ws << L"|\n";
}
Шаблон функции rtrimws
в примере 4 4 — это шаблон обобщённой функции, аналогичной предыдущим примерам, которая принимает basic_string
и удаляет пробелы в ее конце. Но в отличие от других примеров, она для проверки элемента строки и определения того, должен ли он быть удален, принимает не символ, а объект функции.
Перегружать rtrimws
, как это сделано в предыдущем примере, необязательно, но это упрощает синтаксис использования функции, так как вызывающий код при ее использовании может опустить аргумент логической функции.
Но, увы, это решение требует, чтобы вы писали код сами. Если же вы предпочитаете использовать библиотеку — и именно это и следует делать, — то библиотека Boost String Algorithms предоставляет огромное количество функций для обрезки строки, и в ней на верняка есть то, что вам надо. На самом деле, в библиотеке String Algorithms имеется огромное количество удобных функций обрезки, и при возможности использования Boost на них следует посмотреть. Таблица 4.1 приводит шаблоны функций этой библиотеки, используемые для обрезки строк, включая некоторые вспомогательные функции. Так как это шаблоны функций, они имеют параметры шаблонов, представляющие различные используемые типы. Вот что они означают.
Seq
Это тип, удовлетворяющий требованиям к последовательностям стандарта C++.
Coll
Это тип, удовлетворяющий менее строгим требованиям, чем стандартная последовательность. Для того чтобы узнать, каким требованиям удовлетворяет коллекция, обратитесь к определениям Boost String Algorithms.
Pred
Это объект функции или указатель на функцию, которая принимает один аргумент и возвращает логическое значение — другими словами, унарный предикат. В некоторые функции обрезки для обрезки элементов, удовлетворяющих некоторому критерию, можно передать собственный унарный предикат.
OutIt
Это тип, который удовлетворяет требованиям выходного итератора, как определено в стандарте С++. В частности, он должен поддерживать инкрементирование и присвоение нового положения для добавления элементов в конец последовательности, на которую он указывает.
Табл. 4.1. Шаблоны функций обрезки строк Boost
Объявление | Описание |
---|---|
template void trim(Seq& s, const locale& loc = locale()); |
Обрезает пробелы с обоих концов строки, используя для классификации пробельных символов функцию классификации локали |
template void trim_if(Seq& s, Pred p); |
Обрезает с обоих концов последовательности s элементы для которых p(*it) равно true , где it — это итератор, указывающий на элемент последовательности. Обрезка прекращается, когда p(*it) = false |
template Seq trim_copy(const Seq& s, const locale& loc = locale()); |
Делает то же самое, что и trim , но вместо изменения s возвращает новую последовательность, содержащую обрезанные результаты |
template Seq trim_copy_if(const Seq& s, Pred p); |
Делает то же самое, что и trim_if , но вместо изменения s возвращает новую последовательность, содержащую обрезанные результаты |
template OutIt trim_copy_if(OutIt out, const Coll& c, Pred p); |
Делает то же, что и предыдущая версия trim_copy_if , но с некоторыми отличиями. Во-первых, она дает гарантию строгой безопасности исключений. Во-вторых, она в качестве первого аргумента принимает выходной итератор и возвращает выходной итератор, указывающий на одну позицию после конца результирующей последовательности. Наконец, она принимает тип коллекции, а не последовательности. За дополнительной информацией обратитесь к списку перед этой таблицей |
trim_left trim_right |
Работает как trim , но только для левого или правого конца строки |
trim_left_if trim_right_if |
Работает как trim_if , но только для левого или правого конца строки |
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
.
Интервал:
Закладка: