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
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';
}
Эта
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
и удаляет пробелы в ее конце. Но в отличие от других примеров, она для проверки элемента строки и определения того, должен ли он быть удален, принимает не символ, а объект функции.
Поделиться:
Популярные книги
Газлайтер. Том 4
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Зеркало силы
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Энфис 2
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Имя нам Легион. Том 2
2. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Кротовский, не начинайте
2. РОС: Изнанка Империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Стеллар. Заклинатель
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Ведьмак. Перекресток воронов
Фантастика:
фэнтези
5.00
рейтинг книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Отдельный танковый
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Эра Мангуста. Том 2
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Вторая жизнь
Фантастика:
боевая фантастика
альтернативная история
6.88
рейтинг книги
Сумеречный стрелок 7
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00