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

Когда я обнаружил 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

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

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


person hamishmcn    schedule 28.11.2008    source источник
comment
Из интереса, что мешало вам написать собственное преобразование числа в строковую функцию до того, как вы использовали Boost? Я бы увидел дублирование, написал простой шаблон и использовал бы его, а затем, возможно, переключился бы на повышенную версию, когда нашел его ...   -  person Len Holgate    schedule 29.11.2008
comment
Привет, Лен! В разное время в разных проектах я писал шаблонную функцию ToStr, но потом я перешел к другому проекту, а затем написал 3-строчный, потому что я просто хотел сделать чертову вещь :-) как в отличие от накладных расходов на создание файла misc_funcs   -  person hamishmcn    schedule 29.11.2008


Ответы (25)



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

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

person Paul Biggar    schedule 07.08.2009
comment
В статье Эрика Ниблера об условной любви (artima.com/cppsource/foreach.html) описывается как работает BOOST_FOREACH. Это довольно безумно. - person Jeff Hardy; 07.08.2009
comment
Уже не так популярны с C ++ 11 и лямбдами ... - person einpoklum; 25.03.2016

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

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

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

person Rob    schedule 28.11.2008
comment
Пожалуйста, обновите для C ++ 11 / C ++ 14 ... - person einpoklum; 25.03.2016

Мне нравится, как вы можете предоставить свой собственный деструктор для 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" );
}
person hamishmcn    schedule 05.03.2010
comment
Я знаю, что прошло почти два года, но ... это присвоение NULL бесполезно, поскольку оно назначает параметр локальной функции. :) - person Xeo; 15.01.2012
comment
Спасибо @Xeo, я удалил его - person hamishmcn; 28.02.2012

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

person Greg Rogers    schedule 10.02.2009

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

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

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

person Community    schedule 28.11.2008
comment
Теперь доступно как std::tuple. - person Dmitri Nesteruk; 06.05.2014

BOOST_STATIC_ASSERT

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

person Alessandro Jacopson    schedule 28.11.2008
comment
BOOST_MPL_ASSERT_MSG позволяет очень легко читать / обнаруживать ошибки, которые гораздо более информативны, чем размер сообщения неполного типа, которое дает BOOST_STATIC_ASSERT. - person KitsuneYMG; 09.10.2009
comment
Здесь, здесь! Я только что обнаружил одну из этих неполных ошибок типа внутри тестового макроса BOOST_CHECK_CLOSE - мне потребовалось полдня, чтобы выяснить, что происходит, прежде чем я решил, что вызвал его с помощью (int, int, float); как только я преобразовал целые числа в числа с плавающей запятой, ошибка исчезла. Но какое это имеет отношение к неполному типу, я действительно не знаю :) - person Jamie Cook; 17.02.2010

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

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

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

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

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

person Jon Reid    schedule 05.03.2010
comment
Мне нравится, я проверю ASL - person hamishmcn; 05.03.2010

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

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

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

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

person Cyrille Ka    schedule 28.11.2008
comment
Пожалуйста, обновите C ++ 11/14 в эти дни (или подумайте об удалении ответа). - person einpoklum; 25.03.2016

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

person D.Shawley    schedule 29.11.2008

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

person Kit10    schedule 09.03.2010

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

person Vicente Botet Escriba    schedule 20.04.2010
comment
Теперь есть std::thread. - person einpoklum; 25.03.2016

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

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

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


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

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

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

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

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

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

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

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) { ... }
person Paul Fultz II    schedule 15.01.2012
comment
Это действительно круто. Мне пришлось прочитать документацию по назначению ускорения: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html - person hamishmcn; 28.02.2012

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

person Sad Developer    schedule 05.03.2010

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

person amit    schedule 24.06.2010

Я использую boost :: numeric :: ublas: : matrix совсем немного.

person Todd Gamblin    schedule 28.11.2008
comment
Думаю, это устаревшая библиотека. - person Dmitri Nesteruk; 06.05.2014

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

person Robert Gould    schedule 28.11.2008
comment
Умные указатели - это RAII. - person Eclipse; 28.11.2008
comment
точнее, интеллектуальные указатели предоставляют RAII, когда нет другого выбора, кроме как динамически распределять память. - person Branan; 10.02.2009

Хорошо, вот новый, который я нашел:
Вместо использования 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;
person hamishmcn    schedule 10.02.2009

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

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

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

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

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

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

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

person Zeks    schedule 05.09.2012

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

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

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

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

person Klaim    schedule 28.11.2008

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

person Martin Beckett    schedule 28.11.2008
comment
Если вы готовы отказаться от типобезопасности, вы можете свернуть свой собственный с помощью vsnprintf (), многоточия (...), va_list / stdarg.h и локального (основанного на стеке) буфера. - person Mr.Ree; 28.11.2008
comment
std :: string уже имеет на 71 функцию слишком много (по подсчетам Херба Саттера, а не у меня). Подробнее см. gotw.ca/gotw/084.htm: я думаю, этого достаточно информация для объяснения (а) почему формат не обязательно должен быть в std :: string и (б) почему в любом случае лучше писать общие алгоритмы, чем функции-члены класса. - person Steve Jessop; 28.11.2008
comment
Или, другими словами, C ++ похож на чужую страну: там все по-другому ;-) - person Steve Jessop; 28.11.2008
comment
Boost спешит на помощь! Я предполагаю, что Format не входит в стандартную библиотеку, потому что потоки, по-видимому, самая лучшая вещь, поскольку нарезанный хлеб и формат выглядят как неприятный старый 'c'. - person Martin Beckett; 01.12.2008
comment
Формат не является частью библиотеки, потому что одна из проблем, с которыми столкнулся Страуструп при разработке C ++, заключалась в создании типобезопасной отформатированной библиотеки ввода-вывода. Очевидно, результат был тем, что вы видите с iostreams. Видимо, тогда об интерполяции еще никто не думал. Возможно, кто-то захочет написать поток форматирования, чтобы традиционалисты чувствовали себя как дома? - person Phil Miller; 05.03.2010
comment
С помощью вариативных шаблонов в C ++ 11 вы можете создать безопасную версию printf. Конечно, когда C ++ был впервые стандартизирован, они еще не были доступны. - person celtschk; 15.01.2012

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

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

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

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

person rodrigob    schedule 19.11.2010
comment
Я сомневаюсь, что библиотека октонионов используется многими. - person Petter; 06.04.2013