Д. Стефенс - C++. Сборник рецептов

Здесь есть возможность читать онлайн «Д. Стефенс - C++. Сборник рецептов» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: КУДИЦ-ПРЕСС, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

C++. Сборник рецептов: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «C++. Сборник рецептов»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «C++. Сборник рецептов», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Пример 4.16. Подсчет уникальных символов

#include

#include

template

int countUnique(const std::basic_string& s) {

using std::basic_string;

basic_string chars;

for (typename basic_string::const_iterator p = s.begin();

p != s.end(); ++p) {

if (chars.find(*p) == basic.string::npos)

chars += *p;

}

return(chars.length());

}

int main() {

std: :string s = "Abracadabra'";

std::cout << countUnique(s) << '\n';

}

Функции поиска очень часто оказываются полезными. Когда требуется найти что- либо в строке типа string, они должны быть первым, что следует использовать.

4.10. Поиск n-го вхождения подстроки

Проблема

Имея источник sourceи шаблон patternтипа string, требуется найти n-е вхождение patternв source.

Решение

Для поиска последовательных вхождений искомой подстроки используйте метод find. Пример 4.17 содержит простую функцию nthSubstr.

Пример 4.17. Поиск n-го вхождения подстроки

#include

#include

using namespace std;

int nthSubstr(int n, const strings s,

const strings p) {

string::size_type i = s.find(p); // Найти первое вхождение

int j;

for (j = 1; j < n && i != string::npos; ++j)

i = s.find(p, i+1); // Найти следующее вхождение

if (j == n) return(i);

else return(-1);

}

int main() (

string s = "the wind, the sea, the sky, the trees";

string p = "the";

cout << nthSubstr(1, s, p) << '\n';

cout << nthSubstr(2, s, p) << '\n';

cout << nthSubstr(5, s, p) << '\n';

}

Обсуждение

В функцию nthSubstr, имеющую вид, показанный в примере 4.17, можно внести пару улучшений. Во-первых, ее можно сделать общей, сделав из нее вместо обычной функции шаблон функции. Во-вторых, можно добавить параметр, позволяющий учитывать подстроки, которые перекрываются друг с другом. Под перекрывающимися подстроками я понимаю такие, у которых начало строки соответствует части конца такой же строки, как в строке «abracadabra», где последние четыре символа такие же, как и первые четыре. Это демонстрируется в примере 4.18.

Пример 4.18. Улучшенная версия nthSubstr

#include

#include

using namespace std;

template

int nthSubstrg(int n, const basic_string& s,

const basic_string& p, bool repeats = false) {

string::size_type i = s.find(p);

string::size_type adv = (repeats) ? 1 : p.length();

int j;

for (j = 1; j < n && i != basic_string::npos; ++j)

i = s.find(p, i+adv);

if (j == n)

return(i);

else

return(-1);

}

int main() {

string s = AGATGCCATATATATACGATATCCTTA";

string p = "ATAT";

cout << p << " без повторений встречается в позиции "

<< nthSubstrg(3, s, p) << '\n';

cout << p << " с повторениями встречается в позиции "

<< nthSubstrg(3, s, p, true) << '\n';

}

Вывод для строк, использованных в примере 4.18, выглядит так.

ATAT без повторений встречается в позиции 18

ATAT с повторениями встречается в позиции 11

Смотри также

Рецепт 4.9.

4.11. Удаление подстроки из строки

Проблема

Требуется удалить из строки подстроку.

Решение

Используйте методы basic_string find, eraseи length:

std::string t = "Banana Republic";

std::string s = "nana";

std::string::size_type i = t.find(s);

if (i != std::string::npos) t.erase(i, s.length());

Этот код удаляет s.length()элементов, начиная с индекса, по которому findнаходит первое вхождение подстроки.

Обсуждение

На практике встречается огромное количество вариаций на тему поиска и удаления подстрок. Например, может потребоваться удалить все вхождения подстроки, а не одно из них. Или только последнее. Или седьмое. Каждый раз действия будут одни и те же: найдите индекс начала шаблона, который требуется удалить, затем вызовите eraseдля этого индекса и n последующих символов, где n — это длина строки шаблона. За описанием различных методов поиска подстрок обратитесь к рецепту 4.9.

Также велика вероятность, что вам потребуется сделать функцию удаления обобщенной, так чтобы ее можно было использовать с любыми типами символов. Пример 4.19 предлагает общую версию, которая удаляет все вхождения шаблона в строке.

Пример 4.19. Удаление всех подстрок из строки (обобщенная версия)

#include

#include

using namespace std;

template

void removeSubstrs(basic_string& s,

const basic_string& p) {

basic_string::size_type n = p.length();

for (basic_string::size_type i = s.find(p);

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «C++. Сборник рецептов»

Представляем Вашему вниманию похожие книги на «C++. Сборник рецептов» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «C++. Сборник рецептов»

Обсуждение, отзывы о книге «C++. Сборник рецептов» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.