Наиболее часто используемые части Boost [закрыто]

116

Когда я обнаружил, boost::lexical_castто подумал: "Почему я не узнал об этом раньше!" - Я ненавидел писать такой код, как

stringstream ss;
ss << anIntVal;
mystring = ss.str();

Сейчас пишу

mystring = boost::lexical_cast<string>(anIntVal);

Вчера в stackoverflow я наткнулся на сплит-буст (еще одна жемчужина, которая избавит меня от написания кода).

string stringtobesplit = "AA/BB-CC")
vector<string> tokens;

boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); 
// tokens now holds 3 items: AA BB CC

Я собираюсь начать просматривать документацию по boost в поисках других функций, которые я смогу использовать регулярно, но я чувствую, что будет очень легко упустить что-то.

Какие функции повышения вы используете больше всего / не хотели бы иметь?

Hamishmcn
источник
1
Из интереса, что мешало вам написать собственную функцию «конвертировать число в строку» до того, как вы использовали Boost? Я бы увидел дублирование, написал простой шаблон и использовал его, а затем, возможно, переключился на повышенную версию, когда нашел его ...
Лен Холгейт
4
Привет, Лен! В разное время в разных проектах я писал шаблонную функцию «ToStr», но потом я перешел к другому проекту, а потом написал 3-строчный, потому что я просто хотел сделать чертову вещь: - ) в отличие от накладных расходов на создание файла "misc_funcs"
hamishmcn

Ответы:

62

Вероятно, самая используемая часть boost для меня - boost :: shared_ptr .

fhe
источник
13
Также, вероятно, наиболее часто используется. Я сам усвоил урок, решив рефакторинг большинства случаев использования shared_ptr с помощью ссылок, контейнеров указателей и auto_ptr. Сейчас я в основном согласен с этим: bureau14.fr/blogea/index.php/2009/08/...
Amit
1
@phaedrus: Обновленная ссылка: blogea.bureau14.fr/index.php/2009/08/…
MatthewD
4
Больше не актуально в C ++ 11, в котором есть std::shared_ptrи std::unique_ptr.
einpoklum
49

BOOST_FOREACH снова делает жизнь стоящей.

(Почему об этом никто не упомянул? Вопрос задан 8 месяцев назад!)

Пол Биггар
источник
15
В статье Эрика Ниблера «Условная любовь» ( artima.com/cppsource/foreach.html ) описывается, как работает BOOST_FOREACH. Это довольно безумно.
Джефф Харди,
2
Больше не так популярен с C ++ 11 и лямбдами ...
einpoklum
35

Мои любимые, в произвольном порядке:

  • регулярное выражение
  • файловая система
  • нить
  • lexical_cast
  • program_options (просто гениально!)
  • test (для всех моих потребностей в модульном тестировании).
  • Строковые алгоритмы
  • Токенизатор строк
  • format (типобезопасное форматирование строки в стиле printf)
  • умные ptrs

Boost мне очень помог, когда я написал свое первое кроссплатформенное приложение - без него мне действительно пришлось бы бороться.

Роб
источник
4
Пожалуйста, обновите для C ++ 11 / C ++ 14 ...
einpoklum
28

Мне нравится, как вы можете предоставить свой собственный деструктор для shared_ptr.
Это означает, например, что вы можете использовать его FILE*и заставить закрыть файл за вас.
например

void safeclose(FILE*fp) {
    if(fp) {
        fclose(fp);
    }
}
void some_fn() {
    boost::shared_ptr<FILE> fp( fopen(myfilename, "a+t"), safeclose );
    //body of the function, and when ever it exits the file gets closed
    fprintf( fp.get(), "a message\n" );
}
Hamishmcn
источник
1
Я знаю, что прошло почти два года, но ... это назначение NULLбесполезно, поскольку оно присваивает параметр локальной функции. :)
Xeo
1
Спасибо @Xeo, я удалил его
hamishmcn
22

Никто не упомянул о мультииндексных контейнерах, поэтому я напишу позже. Это не так часто, что они вам нужны, но без ускорения создать эквивалентную структуру данных, а также быть менее эффективным - настоящая боль. В последнее время я часто использую их для создания контейнеров, которые просматривают 2 ключа.

Грег Роджерс
источник
20

Я удивлен, что никто не упомянул boost::optional. Я использую его чаще, чем любую часть Boost, кроме shared_ptrи scoped_ptr.

Главный Компьютерщик
источник
1
Теперь доступен как std::experimental::optionalи скоро (C ++ 17?) Как std::optional.
einpoklum
1
Ага, и я очень этому рад. :-) Хотя, учитывая задержку между стандартами и их полной реализацией во всех компиляторах, которые я использую, пройдет еще некоторое время, прежде чем я смогу от него зависеть ... Я только что смог начать использовать C ++ 11 на проект в прошлом году. :-(
Head Geek
На самом деле я думаю, что большинство компиляторов в порядке со стандартами последних лет - GCC и clang поддерживали C ++ 14, когда он был выпущен, не так ли? В любом случае, рассмотрите возможность включения вашего комментария в свой ответ.
einpoklum
@HeadGeek Интересно видеть новый комментарий, добавленный к вашему ответу через 8 лет, и вы ответили!
Deqing
Вау ... Думаю , прошло восемь лет. Как говорит Лягушонок Кермит, когда у тебя мухи, время - это весело. ;-)
Head Geek
19

Никто не упоминает boost :: tuple? Позор!


источник
2
Теперь доступен как std::tuple.
Дмитрий Нестерук
11

BOOST_STATIC_ASSERT

Обновление (октябрь 2011 г.): C ++ 11 (C ++ 0x) имеет static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert

Алессандро Якопсон
источник
5
BOOST_MPL_ASSERT_MSG позволяет очень легко читать / обнаруживать ошибки, которые гораздо более информативны, чем размер сообщения неполного типа, которое дает BOOST_STATIC_ASSERT.
KitsuneYMG
Здесь, здесь! Я только что обнаружил одну из этих неполных ошибок типа внутри тестового макроса BOOST_CHECK_CLOSE - мне потребовалось полдня, чтобы выяснить, что происходит, прежде чем я решил, что вызвал его с помощью (int, int, float); как только я преобразовал целые числа в числа с плавающей запятой, ошибка исчезла. Но какое это имеет отношение к неполному типу, я действительно не знаю :)
Джейми Кук
9

Один из наиболее часто используемых мной - это не собственно Boost, а библиотеки исходного кода Adobe (ASL), построенные на основе Boost - в частности, расширения стандартных алгоритмов, которые принимают boost :: range вместо отдельных итераторов начала / конца. Тогда вместо звонка, скажем,

std::for_each(some_container.begin(), some_container.end(), do_something());

Я могу просто сказать

adobe::for_each(some_container, do_something());

(Я действительно надеюсь, что эти части ASL со временем перейдут на Boost.)

Джон Рид
источник
Мне нравится, я проверю ASL
hamishmcn
8

Я использую много:

  • boost :: сигналы
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bind
  • boost :: random
  • boost :: thread
  • boost :: noncopyable

Другие, такие как Tuple, Static Assert и Integer, очень полезны, если вы пишете библиотеку, которая должна использоваться на различных платформах.

Такие вещи, как графики и лямбда, более конкретны.

Сирил Ка
источник
Пожалуйста, обновите C ++ 11/14 в эти дни (или подумайте об удалении ответа).
einpoklum
8

boost::shared_ptrэто требование для современного программирования на C ++ ИМХО. Вот почему они добавили его в стандарт с TR1. boost::program_options,, boost::bindи boost::signalдействительно хороши, если вы знаете, для чего они нужны и как их использовать. Однако последние два, как правило, пугают новичков.

D.Shawley
источник
7

Мы нашли boost :: spirit очень полезным для бизнес-решения для синтаксического анализа ECMAScript. Сложно, но очень красиво!

Kit10
источник
7

Я удивлен, что пока не вижу между ответами Boost.Thread .

Vicente Botet Escriba
источник
3
Теперь есть std::thread.
einpoklum
7

Я использую shared_ptr уже много лет. Это настолько полезно, что нет причин, по которым проект должен быть без него.

Кроме того, я также использую Bind / Function / Lambda для общих механизмов обратного вызова - особенно полезно при тестировании - а также Format для моей универсальной замены sprintf.

Наконец, буквально на днях я использовал Variant в гневе для решения проблемы (парсер, который мог отвечать небольшим фиксированным набором несвязанных типов токенов). Решение было очень элегантным, и я очень им доволен.


Прошли годы, времена изменились, так что пришло время для обновления. SharedPtr и Function теперь являются частью Standard, а Bind и Lambda устарели из-за фактических лямбда-функций на уровне языка.

Я все еще использую Variant (который также был стандартизирован, но я еще не дошел до него), Format в значительной степени заменен fmtlib (который также был стандартизирован).

Большая часть Boost, которую я использую, - это Boost.Asio. Что находится в процессе стандартизации.

Каз Дракон
источник
1
Я согласен со всем вышеперечисленным, кроме Lambda. Я использовал его некоторое время, но он настолько сложен, что я отказался от него для всех, кроме самых простых выражений. С нетерпением жду C ++ 0x и его форму лямбда-выражений.
Head Geek
Я согласен с тем, что Boost.Lambda полна всевозможных ловушек - как только я вхожу в области Unlambda или Protect, я сдаюсь и делаю это по-старому, но это кажется важным для расширения обратных вызовов любым полуприличным способом . Тем не менее, я тоже жду реализации C ++ 0x.
Kaz Dragon
6

Использование кортежей для итерации карты, например:

string key, value;
BOOST_FOREACH(tie(key, value), my_map) { ... }

Используя назначение boost, я могу инициализировать карту следующим образом:

map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");

А с помощью адаптеров диапазона и оператора вертикальной черты ("|") я могу перебирать значения карты назад (в качестве примера):

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }
Пол Фульц II
источник
1
Это действительно круто. Это заставило меня прочитать документацию по назначению ускорения: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn
5

Вы должны проверить boost :: program_options. Это значительно упрощает синтаксический анализ командной строки.

Грустный разработчик
источник
5

Я использую контейнеры Boost Pointer, а не контейнер shared_ptrs.

амит
источник
3

Я люблю boost :: random и boost :: asio и boost :: filesystem, однако boost :: bind, boost :: round_buffer и boost :: thread очень практичны, интеллектуальные указатели в порядке, но я предпочитаю RAII вместо управления памятью

Роберт Гулд
источник
6
Умные указатели - это RAII.
Eclipse
4
точнее, интеллектуальные указатели предоставляют RAII, когда нет другого выбора, кроме как динамически распределять память.
Бранан,
3

Хорошо, вот новый, который я нашел:
вместо использования stricmp я могу использовать функцию boost equals и передать предикат is_iequal,
например:
вместо

stricmp( "avalue", mystr.c_str() ) == 0

я могу использовать

equals( "avalue", mystr, is_iequal() ) 

дано:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;
Hamishmcn
источник
3

Вот мои два цента:

  • boost :: scope_exit - нет необходимости определять класс RAII только для одного использования
  • boost :: any
  • boost :: option
  • Библиотека контейнеров указателей повышения (ptr_vector)
  • Библиотека Boost Pool
  • boost :: unordered_map / boost :: unordered_set
анатолий
источник
3

Я boost::iclдовольно много использую для постобработки текста. Сэкономил мне довольно много времени, потому что иначе мне пришлось бы реализовать разбиение текста самостоятельно ...

BOOST_FOREACH везде в моем коде :)

boost::functionи boost::bindабсолютно необходимы. Хотя сейчас они std::functionи есть std::bind. Это действительно помогает уменьшить количество ненужного кода и в целом хорошо подходит для моих проектов (или моих заблуждений).

Я недавно начал использовать, boost::interprocess::message_queueи это тоже отличный инструмент.

Я бы использовал гораздо больше, но у Qt есть собственные способы делать много вещей, которые делает Boost. Если бы мне когда-нибудь пришлось программировать чистый C ++, я бы, наверное, стал boost::junkie:)

зэки
источник
3

То, что я использую больше всего, теперь доступно в TR1:

  • общие указатели
  • класс массива

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

Теперь вы понимаете, что Boost предназначен для использования большинством программистов, поэтому он является испытательной площадкой для будущей стандартной библиотеки.

Клаим
источник
1

Говоря о boost :: lexical_cast, почему что-то вроде 'format' не является статическим членом в библиотеке std :: string?
Практически во всех библиотеках графического интерфейса есть что-то вроде CString :: Format ("% i") или QString :: Number ("% i"), которые возвращают инициализированную строку.

Мартин Беккет
источник
4
например: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Роб
Если вы готовы отказаться от типобезопасности, вы можете свернуть свой собственный с помощью vsnprintf (), ellipsis (...), va_list / stdarg.h и локального (основанного на стеке) буфера.
Мистер Ри
2
std :: string уже имеет на 71 функцию слишком много (по подсчетам Херба Саттера, не у меня). Подробнее см. Gotw.ca/gotw/084.htm : я думаю, что у него достаточно информации, чтобы объяснить (а) почему формат не обязательно должен быть в std :: string и (б) почему лучше писать общие алгоритмы, чем член класса все равно функционирует.
Стив Джессоп
4
Или, другими словами, «C ++ похож на чужую страну: там все по-другому» ;-)
Стив Джессоп
1
Формат не является частью библиотеки, потому что одна из проблем, с которыми столкнулся Страуструп при разработке C ++, заключалась в создании типобезопасной библиотеки ввода-вывода с форматированием. Очевидно, результат был тем, что вы видите с iostreams. Видимо, тогда об интерполяции еще никто не думал. Возможно, кто-то захочет написать форматный поток, чтобы традиционалисты чувствовали себя как дома?
Фил Миллер
1

Думаю, вопрос следует изменить. Какую часть своего буста вы не хотели бы использовать?

По моему опыту, почти все это интересно и полезно в каждой проблемной области.

Вам следует потратить время на изучение документации по бустам, чтобы найти области, которые охватывают ваши интересы.

Одним исключением может быть то, boost::numeric::ublasчто он выполняет свою работу, но Eigen делает это заметно лучше.

rodrigob
источник
Я сомневаюсь, что библиотека октонионов используется многими.
Петтер