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

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

Жанры

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

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

Шрифт:

}

int main {

 string s = "Appendix A";

 wstring ws = L"Acknowledgments"; // "L" указывает, что

// этот литерал состоит из

 pad(s, 20. "*"); // широких символов

 pad(ws, 20, L'*');

 // cout << s << std::endl; // He следует пытаться выполнить это

 wcout << ws << std::endl; // одновременно

}

pad
в примере 4.1 дополняет данную строку
s
до длины n, используя символ
c
. Так как шаблон функции использует параметризованный тип элементов строки (
T
), он будет работать для
basic_string
из любых символов:
char
,
wchar_t
или любых других, определенных пользователем.

4.2. Обрезка строк

Проблема

Требуется обрезать несколько символов в конце или начале строки, обычно пробелов.

Решение

Для определения позиции строки, которую требуется удалить, используйте итераторы, а для ее удаления — метод

erase
. Пример 4.2 показывает функцию
rtrim
, которая удаляет символ в конце строки.

Пример 4.2. Обрезка символов строки

#include <string>

#include <iostream>

// Подход для строк из узких символов

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 <string>

#include <iostream>

using namespace std;

// Общий подход к обрезке отдельных

// символов строки

template<typename T>

void rtrim(basic_string<T>& s, T с) {

 if (s.empty) return;

 typename basic_string<T>::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
из заголовочного файла
<cctype>
(и ее
wchar_t
– эквивалент
iswspace
из
<cwctype>
). Пример 4.4 определяет общую функцию, которая обрезает концевые пробелы.

Пример 4.4. Удаление концевых пробелов

#include <string>

#include <iostream>

#include <cctype>

#include <cwctype>

using namespace std;

template<typename T, typename F>

void rtrimws(basic_string<T>& s, F f) {

 if (s.empty) return;

 typename basic_string<T>::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
и удаляет пробелы в ее конце. Но в отличие от других примеров, она для проверки элемента строки и определения того, должен ли он быть удален, принимает не символ, а объект функции.

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

70 Рублей

Кожевников Павел
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
70 Рублей

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Я не Монте-Кристо

Тоцка Тала
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Я не Монте-Кристо

Метатель. Книга 2

Тарасов Ник
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 2

Мама из другого мира. Дела семейные и не только

Рыжая Ехидна
4. Королевский приют имени графа Тадеуса Оберона
Любовные романы:
любовно-фантастические романы
9.34
рейтинг книги
Мама из другого мира. Дела семейные и не только

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Убивать чтобы жить 5

Бор Жорж
5. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 5

Девочка-лед

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

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Ведьма Вильхельма

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

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Законы Рода. Том 7

Flow Ascold
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

Ох уж этот Мин Джин Хо 1

Кронос Александр
1. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 1