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

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

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

Сейчас я пишу

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

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

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 в поисках других функций, которые я смогу использовать регулярно, но я чувствую, что будет очень легко упустить что-то.

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

Из интереса, что мешало вам написать собственную функцию «конвертировать число в строку» до того, как вы использовали Boost? Я бы увидел дублирование, написал простой шаблон и использовал его, а затем, возможно, переключился на версию с ускорением, когда нашел его ...

Len Holgate 29.11.2008 12:35

Привет, Лен! В разное время в разных проектах я писал шаблонную функцию «ToStr», но потом я перешел к другому проекту, а потом написал 3-строчный, потому что я просто хотел сделать чертову вещь: - ) в отличие от накладных расходов на создание файла "misc_funcs"

hamishmcn 29.11.2008 22:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
117
2
19 355
25
Перейти к ответу Данный вопрос помечен как решенный

Ответы 25

Ответ принят как подходящий

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

Также, вероятно, наиболее часто используется. Я сам усвоил урок, решив реорганизовать большинство случаев использования shared_ptr с помощью ссылок, контейнеров-указателей и auto_ptr. Сейчас я в основном с этим согласен: bureau14.fr/blogea/index.php/2009/08/…

amit 24.06.2010 11:58

@phaedrus: Обновленная ссылка: blogea.bureau14.fr/index.php/2009/08/…

MatthewD 17.12.2013 03:08

Больше не актуально в C++ 11, в котором есть std::shared_ptr и std::unique_ptr.

einpoklum 25.03.2016 03:10

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

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

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

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

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

Умные указатели - это RAII.

Eclipse 28.11.2008 22:19

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

Branan 10.02.2009 20:54

Я довольно часто использую boost :: numeric :: ublas :: matrix.

Думаю, это устаревшая библиотека.

Dmitri Nesteruk 06.05.2014 14:13

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

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

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

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

Пожалуйста, обновите C++ 11/14 в эти дни (или подумайте об удалении ответа).

einpoklum 25.03.2016 03:13

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

например: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();

Rob 28.11.2008 19:04

Если вы готовы отказаться от типобезопасности, вы можете свернуть свой собственный с помощью vsnprintf (), многоточия (...), va_list / stdarg.h и локального (основанного на стеке) буфера.

Mr.Ree 28.11.2008 21:27

std :: string уже имеет на 71 функцию слишком много (по подсчетам Херба Саттера, а не у меня). Подробнее см. gotw.ca/gotw/084.htm: я думаю, что у него достаточно информации, чтобы объяснить (а) почему формат не обязательно должен быть в std :: string и (б) почему в любом случае лучше писать общие алгоритмы, чем функции-члены класса.

Steve Jessop 28.11.2008 21:45

Или, другими словами, «C++ похож на чужую страну: там все по-другому» ;-)

Steve Jessop 28.11.2008 21:53

Boost спешит на помощь! Я предполагаю, что Format не входит в стандартную библиотеку, потому что потоки, по-видимому, самая лучшая вещь, поскольку нарезанный хлеб и формат выглядят как неприятный старый 'c'.

Martin Beckett 01.12.2008 20:25

Формат не является частью библиотеки, потому что одна из проблем, с которыми столкнулся Страуструп при разработке C++, заключалась в создании типобезопасной отформатированной библиотеки ввода-вывода. Очевидно, результат был тем, что вы видите с iostreams. Видимо, тогда об интерполяции еще никто не думал. Может быть, кто-то захочет написать поток форматирования, чтобы традиционалисты чувствовали себя как дома?

Phil Miller 05.03.2010 08:17

С помощью вариативных шаблонов в C++ 11 вы можете создать типизированную версию printf. Конечно, когда C++ был впервые стандартизирован, они еще не были доступны.

celtschk 15.01.2012 12:34

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

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

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

Пожалуйста, обновите для C++ 11 / C++ 14 ...

einpoklum 25.03.2016 03:11

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

Теперь доступен как std::tuple.

Dmitri Nesteruk 06.05.2014 14:10

BOOST_STATIC_ASSERT

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

BOOST_MPL_ASSERT_MSG позволяет очень легко читать / обнаруживать ошибки, которые гораздо более информативны, чем размер сообщения неполного типа, которое дает BOOST_STATIC_ASSERT.

KitsuneYMG 09.10.2009 23:16

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

Jamie Cook 17.02.2010 12:09

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

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

Теперь доступен как std::experimental::optional и скоро (C++ 17?) Как std::optional.

einpoklum 25.03.2016 03:12

Ага, и я очень этому рад. :-) Хотя, учитывая задержку между стандартами и их полной реализацией во всех компиляторах, которые я использую, пройдет еще некоторое время, прежде чем я смогу на него рассчитывать ... Я только что смог начать использовать C++ 11 на проект в прошлом году. :-(

Head Geek 26.03.2016 16:32

На самом деле я думаю, что с большинством компиляторов все в порядке. соответствие стандартам последних лет - GCC и clang поддерживали C++ 14, когда он был выпущен, не так ли? В любом случае, рассмотрите возможность включения вашего комментария в свой ответ.

einpoklum 26.03.2016 16:33

@HeadGeek Интересно видеть новый комментарий, добавленный к вашему ответу через 8 лет, и вы ответили!

Deqing 12.06.2016 09:33

Вау ... Думаю, имеет было восемь лет. Как говорит лягушка Кермит, когда у тебя мухи, время - это весело. ;-)

Head Geek 13.06.2016 08:24

Теперь доступен как std::optional на C++ 17

RazeLighter777 02.09.2017 22:51

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

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

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


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

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

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

Я согласен со всем вышеперечисленным, кроме Lambda. Я использовал его некоторое время, но он настолько сложен, что я отказался от него для всех, кроме самых простых выражений. С нетерпением жду C++ 0x и его форму лямбда-выражений.

Head Geek 04.12.2008 20:32

Я согласен с тем, что Boost.Lambda полна всевозможных ловушек - как только я вхожу в области Unlambda или Protect, я сдаюсь и делаю это по-старому, но это кажется важным для расширения обратных вызовов любым полуприличным способом . Тем не менее, я тоже жду реализации C++ 0x.

Kaz Dragon 26.02.2009 18:14

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

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

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

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

дано:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;

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

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

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

Статья Эрика Ниблера «Условная любовь» (artima.com/cppsource/foreach.html) описывает, как работает BOOST_FOREACH. Это довольно безумно.

Jeff Hardy 07.08.2009 21:31

Уже не так популярны с C++ 11 и лямбдами ...

einpoklum 25.03.2016 03:11

Мне нравится, как вы можете предоставить свой собственный деструктор для 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" );
}

Я знаю, что прошло почти два года, но ... это назначение NULL бесполезно, поскольку оно назначает параметр локальной функции. :)

Xeo 15.01.2012 12:44

Спасибо @Xeo, я удалил его

hamishmcn 28.02.2012 22:34

Один из наиболее часто используемых мной - это не собственно 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 05.03.2010 09:41

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

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

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

Теперь есть std::thread.

einpoklum 25.03.2016 03:13

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

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

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

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

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

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

Petter 06.04.2013 19:54

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

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

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

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) { ... }

Это действительно круто. Это заставило меня прочитать документацию по назначению ускорения: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html

hamishmcn 28.02.2012 22:36

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

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

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

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

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

Другие вопросы по теме