Библиотека Boost C: описание, подробная инструкция по использованию
Библиотека Boost призвана облегчить разработку на языке программирования С. И она с этой задачей очень качественно справляется — это доказано тысячами Си-разработчик ов , которые ее постоянно используют в своих проектах. Библиотека Boost — это не панацея от всех проблем с языком С, но то , что она покрывает все основные потребности разработки на этом языке , — это точно.
Поэтому если вы являетесь молодым Си-разработчиком, то обязательно попробуйте этот инструмент в своих проектах — более опытные Си-разработчики давно о нем знают. Как только ее попробу е те, библиотека Boost С обязательно станет одной из самых используемых и любимых вами.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Boost C++ Libraries
Boost provides free peer-reviewed portable C++ source libraries.
We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications. The Boost license encourages the use of Boost libraries for all users with minimal restrictions.
We aim to establish «existing practice» and provide reference implementations so that Boost libraries are suitable for eventual standardization. Beginning with the ten Boost Libraries included in the Library Technical Report (TR1) and continuing with every release of the ISO standard for C++ since 2011, the C++ Standards Committee has continued to rely on Boost as a valuable source for additions to the Standard C++ Library.
Boost as an organization
The Boost organization and wider Boost community supports research and education into the best possible uses of C++ and libraries developed for it, particularly, but not exclusively those contained in the Boost Library.
The organization and community support mailing lists and chat rooms to educate about best practices and cutting edge techniques for the user of Boost Libraries and C++ in general.
Since 2006 an intimate week long annual conference related to Boost called C++ Now has been held in Aspen, Colorado each May. The conference is an educational opportunity focused on cutting-edge C++. Boost has been a participant in the annual Google Summer of Code since 2007, in which students develop their skills by working on Boost Library development.
Getting Started
Boost works on almost any modern operating system, including UNIX and Windows variants. Follow the Getting Started Guide to download and install Boost. Popular Linux and Unix distributions such as Fedora, Debian, and NetBSD include pre-built Boost packages. Boost may also already be available on your organization’s internal web server.
If you want to develop Boost, there’s a getting started guide on the wiki.
Background
Read on with the introductory material to help you understand what Boost is about and to help in educating your organization about Boost.
Community
Boost welcomes and thrives on participation from a variety of individuals and organizations. Many avenues for participation are available in the Boost Community.
Находим более качественные решения при помощи boost

Каждый C++-разработчик хотя бы слышал о Boost – это, пожалуй, наиболее распространенный набор внешних библиотек, используемый в мире C++. Истоки большинства стандартных библиотек восходят к Boost, поскольку многие разработчики Boost также входят в состав комитета по стандартам C++ и именно они определяют, в каком направлении будет развиваться язык – поэтому можете считать Boost своеобразным дорожным указателем. Возвращаясь к заголовку этой статьи — ‘Boost’ содержит много популярного функционала, вспомогательных библиотек, так, что, если вы столкнулись с какой-нибудь распространенной проблемой – первым делом обращайтесь к Boost, так как велики шансы, что там для вас найдется готовое решение.
Скажу еще несколько слов о синергии между Boost и стандартом C++. Большинство библиотек std – в частности, контейнеры, умные указатели, поддержка многопоточности, регулярные выражения, поддержка файловой системы, кортежи, варианты и многие другие – как правило, портированы из Boost. Этот тренд продолжится, но, поскольку в Boost такое множество разноцелевых библиотек, сейчас не для всех из них найдется место в стандарте, так как они слишком специализированные, зависят от контекста или просто не настолько популярны, чтобы переносить их в сам язык. В этой статье я постараюсь рассказать о некотором подобном функционале, сосредоточившись на тех возможностях, которые пока не входят в стандарт. Я покажу вам некоторые вещи, которые нахожу полезными – и вам, надеюсь, они тоже понравятся.
Контейнеры
Начнем с рассмотрения контейнеров, предлагаемых в Boost, но пока отсутствующих в stl (и которым даже не светит туда попасть). Стоит отметить, что со времен C++11 многие из контейнеров Boost уже портированы. Теперь у нас есть нечто вроде std::unordered_set , std::unordered_map с их неуникальными версиями, которые реализованы на таблицах хеширования, std::array , обертке для массива std::forward_list на чистом С. Название достаточно прозрачное, а в C++20 мы получили std::span , который фактически является классом для представления памяти. Первые реализации всех этих новых типов контейнеров появились в Boost и широко использовались до того, как добрались до ‘stl’. Теперь давайте рассмотрим еще некоторые очень полезные, но не настолько универсальные контейнеры, оставшиеся в Boost .
Векторные типы
Вероятно, из всех типов контейнеров в мире C++ чаще всего используется std::vector . Он предлагает непрерывную динамическую память, в которой может храниться неопределенное количество объектов. Но у такого подхода есть некоторые недостатки: например, добавление новых данных в хранилище будет приводить к тому, что блоки памяти станут выделяться заново. При многочисленных операциях выделения это может серьезно ударить по производительности. Теперь представьте, что мы будем хранить некоторое определенное количество объектов, достаточно небольшое. В таком случае «плата» за выделение и повторное выделение памяти кажется расточительной – ведь мы уже с большей или меньшей уверенностью сможем спрогнозировать, сколько памяти нам понадобится. На такой случай в качестве решения может пригодиться boost::container::small_vector , и вот как вы можете инициализировать такой контейнер:
boost::container::small_vector – отличный выбор на такой случай. Второй аргумент шаблона указывает, сколько объектов может храниться в массиве на стеке, без какого-либо динамического выделения. Похожая структура достижима при помощи std::array , но во втором случае возникает два крупных недостатка. Первый заключается в том, что boost::container::small_vector на самом деле позволяет добавить больше элементов, чем вы указали. В таком случае он выделяет блок динамической памяти и копирует все элементы туда. Такого варианта следует избегать или считать, что он допустим изредка, поскольку статический массив является членом класса, и эта память будет расходоваться зря. Другое преимущество boost::container::small_vector над std::array в том, что у него векторный интерфейс, и он позиционируется как динамический контейнер. Благодаря этому, вы можете с легкостью выяснять, сколько именно объектов на самом деле было инициализировано, и в итоге не получаете какого-либо неопределенного поведения или аварийного завершения, попытавшись управлять ими самостоятельно. boost::container::small_vector обычно может заменить std::vector в имеющемся коде, для этого нужно просто изменить тип переменной. Другой контейнер, похожий на boost::container::small_vector – это boost::container::static_vector , и определяется он примерно так же:
Вся разница в том, что он никогда не выделяет динамическую память. Когда вы добавляете элемент сверх его проходимости, он выбрасывает исключение. Поэтому им следует пользоваться, когда элементов не может быть больше, чем вы указали, а также существует потребность в вектороподобном интерфейсе.
Кольцевой буфер
Еще один пример вспомогательного контейнера из Boost – это boost::circular_buffer . Всякий раз, когда вы хотите создать какой-нибудь простой фреймворк для логирования, или, может быть, ваше приложение собирает какую-нибудь статистику, и в нем нужно хранить фиксированное количество самых новых записей, то кольцевой буфер – то, что нужно. Boost дает нам простое, но разностороннее решение, boost::circular_buffer . Он совместим с интерфейсом контейнеров STL, поэтому считайте его предпочтительнее вашего собственного класса, ведь с таким буфером дальнейшая интеграция с существующим кодом будет гораздо проще.
В вышеприведенном примере мы добавляем в кольцевой буфер три элемента и выводим их на экран. Вывод должен выглядеть так: 1 2 3. После того, как мы добавим значение 4, но буфер уже заполнен, поэтому 1 удаляется из него, и мы видим 2 3 4.
Битовый массив
Есть и еще один очень интересный, хотя и немного странный контейнер: boost::bimap . Он придется кстати, когда требуется искать словарь не только по его ключам, но и по значениям. Чтобы вообразить, что такое битовый массив, и как он работает, можете представить себе два классических словаря, так, что в обоих хранятся одни и те же объекты, но ключи одного – это значения другого, и наоборот. Эта взаимосвязь отлично проиллюстрирована в официальной документации.

Теперь поближе к практике. Левая и правая стороны boost::bimap – это пара множеств с типами, указываемыми пользователем. Благодаря этому мы можем создать очень специализированный контейнер, алгоритмическая сложность у которого с обеих сторон разная. Так, например, если вам нужна уникальная неупорядоченная хеш-таблица слева и упорядоченная неуникальная древовидная структура справа, то можно выбрать unordered_set_of и multiset_of соответственно. Теперь давайте попытаемся создать такой контейнер.
Вставляем четыре пары из строк и целых чисел. Целые числа хранятся в мультимножестве в правой части карты битов, поэтому попытаемся добавить значение 1 дважды. Вывод этого фрагмента кода будет ad , так как и a , и d спарены с 1 .
boost::bimap – отличный способ хранить зависимые пары переменных, доступ к которым должен предоставляться с обеих сторон. В данном случае мы можем определять оптимальные структуры данных для нашего случая использования, а битовый массив отвечает за их реализацию. Это один из самых изощренных и широко доступных контейнеров, который может быть очень мощным, если его использовать рационально.
Токенизатор
Разделение строк – это задача, о которую время от времени спотыкается любой разработчик, а boost::tokenizer предоставляет нам сложное и эффективное решение для этой цели. Можно несколькими способами определить критерии разделения, начиная от простых разделителей символов до метасимволов, смещений и пр. Теперь давайте заглянем в следующий код.
В вышеприведенном примере мы создаем объект-разделитель, который будет определять поведение токенизатора. Первый аргумент «, » использует в качестве разделительных знаков запятые и пробелы, а из окончательного вывода их удаляет. Немного иная ситуация складывается со вторым аргументом «+». Он также выделяет разделительный знак, но мы оставим те, что указаны здесь. Последнее, что мы в нем задали – отбросить пустые токены, поскольку в этом примере они нам не нужны. Окончательный вывод должен выглядеть как String_for_tokenizer_test_C_+_+_ , все токены разделены нижними подчеркиваниями и, как мы видим, запятые и пробелы удалены.
Теперь давайте изменим этот код для другого очень распространенного случая, то есть, для токенизации формата csv. Это проще простого, так как boost::tokenizer это уже поддерживает. Все, что от нас требуется – заменить boost::char_separator на boost::escaped_list_separator . В нем поля по умолчанию разделяются запятыми, причем, различаются случаи, в которых разделяются сами поля, и случаи, когда разделяются части полей.
Вывод вышеприведенной программы выглядит так: Name_Surname_Age_Street,Number,Postal Code,City_
Часть, содержащая адрес, была интерпретирована как одно поле, как и планировалось, причем, с помощью обычного boost::char_separator мы бы этого не сделали.
Сетевая поддержка Boost Asio
Boost Asio (что означает «асинхронный ввод/вывод») – это библиотека, в которой нам предоставляется фреймворк для асинхронной обработки задач. Она часто используется, когда у вас на руках есть функции, на выполнение которых требуется много времени – обычно это функции, обращающиеся к внешним ресурсам. Но в этом разделе мы не будем говорить об очередях задач, асинхронной обработке, таймерах и тому подобном. Мы сосредоточимся на одном из внешних сервисов, который напрямую поддерживается Boost Asio – речь о сетевом взаимодействии. Большое преимущество этого фреймворка в том, что он позволяет писать кроссплатформенные сетевые функции, поэтому вам больше не требуется писать иную реализацию для каждой из ваших целевых систем. У него есть собственная сокетная реализация с поддержкой протоколов транспортного уровня, в частности, TCP , UDP , ICMP , а также шифрования SSL/TLS . Теперь давайте напишем пример, который выполнит безопасное рукопожатие по TCP.
Итак, когда у вас есть установленное соединение, можно вызвать boost::asio::write и boost::asio::read для коммуникации с сервером. Если у вас уже есть опыт работы со, скажем, сокетами POSIX , то вы быстро уловите, как делаются дела в Boost Asio .
Заключение
Целью этой статьи было представить некоторые библиотеки и возможности Boost, которые мне когда-либо пригодились. На самом деле, в Boost есть уже очень много вещей, а в каждом релизе добавляются новые. Например, в версии 1.73, новейшей на момент написания статьи, появилась сериализация JSON и легковесный фреймворк для обработки ошибок, он LEAF . Рекомендую вам самостоятельно следить за нововведениями, поскольку они могут сэкономить вам массу времени на разработку функциональности, которая уже может присутствовать в Boost .
Библиотека Boost
Boost — собрание библиотек, расширяющих C++. Cвободно распространяются по лицензии Boost Software License вместе с исходным кодом. Проект был создан после принятия стандарта C++, когда многие были недовольны невключением в стандарт некоторых библиотек. Проект является своего рода «испытательным полигоном» для различных расширений языка и часть библиотек являются кандидатами на включение в следующий стандарт C++.
Boost имеет заметную направленность на исследования и расширяемость (метапрограммирование и обобщённое программирование с активным использованием шаблонов). Благодаря тщательному подбору и контролю качества, библиотеки, включённые в Boost, обладают высокой надёжностью и производительностью. Мнения относительно использования различаются. Некоторые считают его стандартом де-факто и необходимым дополнением к STL. Некоторые, напротив, избегают всякого использования библиотеки в проектах, так как это лишняя зависимость в проекте и для использования этих библиотек программисту необходимо хорошо знать C++, так как некоторые части Boost требуют довольно хорошей подготовки программиста и являются весьма сложными.
Содержание
Библиотеки
Библиотеки Boost охватывают следующее:
Примеры
Линейная алгебра
Boost включает библиотеку линейной алгебры uBLAS, с операциями для векторов и матриц.
- Пример показывающий умножение матрицы на вектор:
Генерация случайных чисел
Boost предоставляет различные генераторы псевдослучайных чисел, для каждого из которых можно задавать конкретное распределение.
- Пример показывающий генерацию случайных чисел с нормальным распределением:
Разбор текста
Spirit — одна из наиболее сложных частей Boost, предназначенная для написания парсеров напрямую в C++ тексте программы в виде близком к форме Бэкуса-Наура.
- Парсер для чтения чисел, разделённых запятой:
Использование регулярных выражений
Boost.Regex — библиотека работы с регулярными выражениями. Имеет необходимый функционал для фильтрации, поиска, разбора и обработки текста.
- Пример программы для разбора текста
Алгоритмы на графах
Boost Graph предоставляет гибкую и эффективную реализацию концепции графов в виде нескольких представлений графа и большого количества алгоритмов.
- Пример выполнения алгоритма топологической сортировки:
Многопоточность
Пример кода, показывающий создание потоков:
-
в Dr. Dobb’s Journal. (2002) в Dr. Dobb’s Journal. (2008)
- Boost.Threads API reference. основано на Boost.Thread
См. также
Ссылки
Wikimedia Foundation . 2010 .
Полезное
Смотреть что такое «Библиотека Boost» в других словарях:
Boost (библиотека) — Boost Тип библиотека (программирование) Написана на С++ Операционная система Кроссплатформенный Последняя версия Boo … Википедия
Boost — Тип библиотека (программирование) Написана на С++ Операционная система Кроссплатформенный Последняя версия Boost 1.52.0 (05.11.2012) … Википедия
Стандартная библиотека языка C++ — Стандартная библиотека языка программирования C++ fstream iomanip ios iostream sstream Стандартная библиотека шаблонов … Википедия
Стандартная библиотека шаблонов — Стандартная библиотека языка программирования C++ fstream iomanip ios iostream sstream Стандартная библиотека шаблонов … Википедия
C++ — У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в … Википедия
Trim (программирование) — Trim или strip часто используемое название для строковой функции, которая удаляет начальные и конечные пробелы. Например, в Python: Это тест .strip() возвращает строку: Это тест Содержание 1 Ва … Википедия
Trim — У этого термина существуют и другие значения, см. TRIM. Trim или strip часто используемое название для строковой функции, которая удаляет начальные и конечные пробелы. Например, в Python: Это тест .strip() возвращает строку: Это тест… … Википедия
Александреску, Андрей — Андрей Александреску на конференции ACCU в 2009 году Андрей Александреску (англ. Andrei Alexandrescu) румынский … Википедия
Пайтон — Python Класс языка: функциональный, объектно ориентированный, императивный, аспектно ориентированный Тип исполнения: интерпретация байт кода, компиляция в MSIL, компиляция в байт код Java Появился в: 1990 г … Википедия
С++ — См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп … Википедия