Когда я обнаружил 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 в поисках других функций, которые я смогу использовать регулярно, но я чувствую, что будет очень легко упустить что-то.
Какие функции повышения вы используете больше всего / не хотели бы иметь?
Привет, Лен! В разное время в разных проектах я писал шаблонную функцию «ToStr», но потом я перешел к другому проекту, а потом написал 3-строчный, потому что я просто хотел сделать чертову вещь: - ) в отличие от накладных расходов на создание файла "misc_funcs"





Вероятно, самая используемая часть повышения для меня - это boost :: shared_ptr.
Также, вероятно, наиболее часто используется. Я сам усвоил урок, решив реорганизовать большинство случаев использования shared_ptr с помощью ссылок, контейнеров-указателей и auto_ptr. Сейчас я в основном с этим согласен: bureau14.fr/blogea/index.php/2009/08/…
@phaedrus: Обновленная ссылка: blogea.bureau14.fr/index.php/2009/08/…
Больше не актуально в C++ 11, в котором есть std::shared_ptr и std::unique_ptr.
То, что я использую больше всего, теперь доступно в TR1:
Теперь я также использую классы пула и некоторые другие более специфические вещи.
Теперь вы понимаете, что Boost предназначен для использования большинством программистов, поэтому он является испытательной площадкой для будущей стандартной библиотеки.
Я люблю boost :: random и boost :: asio и boost :: filesystem, однако boost :: bind, boost :: round_buffer и boost :: thread очень практичны, умные указатели в порядке, но я предпочитаю RAII вместо управления памятью
Умные указатели - это RAII.
точнее, интеллектуальные указатели предоставляют RAII, когда нет другого выбора, кроме как динамически распределять память.
Я довольно часто использую boost :: numeric :: ublas :: matrix.
Думаю, это устаревшая библиотека.
Я использую много:
Другие, такие как Tuple, Static Assert и Integer, очень полезны, если вы пишете библиотеку, которая должна использоваться на различных платформах.
Такие вещи, как графики и лямбда, более конкретны.
Пожалуйста, обновите C++ 11/14 в эти дни (или подумайте об удалении ответа).
Говоря о boost :: lexical_cast, почему что-то вроде 'format' не является статическим членом в библиотеке std :: string?
Почти во всех библиотеках графического интерфейса есть что-то вроде CString :: Format ("% i") или QString :: Number ("% i"), которые возвращают инициализированную строку.
например: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Если вы готовы отказаться от типобезопасности, вы можете свернуть свой собственный с помощью vsnprintf (), многоточия (...), va_list / stdarg.h и локального (основанного на стеке) буфера.
std :: string уже имеет на 71 функцию слишком много (по подсчетам Херба Саттера, а не у меня). Подробнее см. gotw.ca/gotw/084.htm: я думаю, что у него достаточно информации, чтобы объяснить (а) почему формат не обязательно должен быть в std :: string и (б) почему в любом случае лучше писать общие алгоритмы, чем функции-члены класса.
Или, другими словами, «C++ похож на чужую страну: там все по-другому» ;-)
Boost спешит на помощь! Я предполагаю, что Format не входит в стандартную библиотеку, потому что потоки, по-видимому, самая лучшая вещь, поскольку нарезанный хлеб и формат выглядят как неприятный старый 'c'.
Формат не является частью библиотеки, потому что одна из проблем, с которыми столкнулся Страуструп при разработке C++, заключалась в создании типобезопасной отформатированной библиотеки ввода-вывода. Очевидно, результат был тем, что вы видите с iostreams. Видимо, тогда об интерполяции еще никто не думал. Может быть, кто-то захочет написать поток форматирования, чтобы традиционалисты чувствовали себя как дома?
С помощью вариативных шаблонов в C++ 11 вы можете создать типизированную версию printf. Конечно, когда C++ был впервые стандартизирован, они еще не были доступны.
Мои любимые, в произвольном порядке:
Boost оказал огромную помощь, когда я написал свое первое кроссплатформенное приложение - без него я бы действительно боролся.
Пожалуйста, обновите для C++ 11 / C++ 14 ...
Никто не упоминает boost :: tuple? Позор!
Теперь доступен как std::tuple.
Обновлять (октябрь 2011 г.): C++ 11 (C++ 0x) имеет static_asserthttp://www2.research.att.com/~bs/C++0xFAQ.html#static_assert
BOOST_MPL_ASSERT_MSG позволяет очень легко читать / обнаруживать ошибки, которые гораздо более информативны, чем размер сообщения неполного типа, которое дает BOOST_STATIC_ASSERT.
Здесь, здесь! Я только что обнаружил одну из этих неполных ошибок типа внутри макроса тестирования BOOST_CHECK_CLOSE - мне потребовалось полдня, чтобы выяснить, что происходит, прежде чем я решил, что вызвал его с помощью (int, int, float); как только я преобразовал целые числа в числа с плавающей запятой, ошибка исчезла. Но какое это имеет отношение к неполному типу, я действительно не знаю :)
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.
Ага, и я очень этому рад. :-) Хотя, учитывая задержку между стандартами и их полной реализацией во всех компиляторах, которые я использую, пройдет еще некоторое время, прежде чем я смогу на него рассчитывать ... Я только что смог начать использовать C++ 11 на проект в прошлом году. :-(
На самом деле я думаю, что с большинством компиляторов все в порядке. соответствие стандартам последних лет - GCC и clang поддерживали C++ 14, когда он был выпущен, не так ли? В любом случае, рассмотрите возможность включения вашего комментария в свой ответ.
@HeadGeek Интересно видеть новый комментарий, добавленный к вашему ответу через 8 лет, и вы ответили!
Вау ... Думаю, имеет было восемь лет. Как говорит лягушка Кермит, когда у тебя мухи, время - это весело. ;-)
Теперь доступен как std::optional на C++ 17
Я использую shared_ptr уже много лет. Это настолько полезно, что нет причин, по которым проект должен быть без него.
Кроме того, я также использую Bind / Function / Lambda для общих механизмов обратного вызова - особенно полезно при тестировании - а также Format для моей универсальной замены sprintf.
Наконец, буквально на днях я использовал Variant в гневе для решения проблемы (синтаксический анализатор, который мог отвечать небольшим фиксированным набором несвязанных типов токенов). Решение было очень элегантным, и я очень им доволен.
Прошли годы, времена изменились, так что пришло время для обновления. SharedPtr и Function теперь являются частью Standard, а Bind и Lambda устарели из-за фактических лямбда-функций на уровне языка.
Я все еще использую Variant (который также был стандартизирован, но я еще не дошел до него), Format в значительной степени заменен fmtlib (который также был стандартизирован).
Большая часть Boost, которую я использую, - это Boost.Asio. Которая находится в процессе стандартизации.
Я согласен со всем вышеперечисленным, кроме Lambda. Я использовал его некоторое время, но он настолько сложен, что я отказался от него для всех, кроме самых простых выражений. С нетерпением жду C++ 0x и его форму лямбда-выражений.
Я согласен с тем, что Boost.Lambda полна всевозможных ловушек - как только я вхожу в области Unlambda или Protect, я сдаюсь и делаю это по-старому, но это кажется важным для расширения обратных вызовов любым полуприличным способом . Тем не менее, я тоже жду реализации C++ 0x.
Хорошо, вот новый, который я нашел:
Вместо использования стрикмп я могу использовать функцию 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. Это довольно безумно.
Уже не так популярны с C++ 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, я удалил его
Один из наиболее часто используемых мной - это не собственно 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
Вы должны проверить boost :: program_options. Это значительно упрощает синтаксический анализ командной строки.
Мы обнаружили, что boost :: spirit очень полезен для бизнес-решения для синтаксического анализа ECMAScript. Сложно, но очень красиво!
Я удивлен, что пока не вижу между ответами Boost.Thread.
Теперь есть std::thread.
Я использую контейнеры Boost Pointer, а не STL-контейнер shared_ptr.
Думаю, вопрос следует изменить. Какую часть себя вы бы усилили не хочу, чтобы использовать?
По моему опыту, почти все это интересно и полезно в каждой проблемной области.
Вам следует потратить время на изучение документации по бустам, чтобы найти области, которые охватывают ваши интересы.
Одним исключением может быть boost::numeric::ublas, который выполняет свою работу, но Эйген делает это значительно лучше.
Я сомневаюсь, что библиотека октонионов используется многими.
Вот мои два цента:
Использование кортежей для итерации карты, например:
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
Я довольно часто использую boost::icl для постобработки текста. Сэкономил мне довольно много времени, потому что в противном случае мне пришлось бы самому реализовать разделение текста ...
BOOST_FOREACH везде в моем коде :)
boost::function и boost::bind абсолютно необходимы. Хотя сейчас это std::function и std::bind. Это действительно помогает уменьшить количество ненужного кода и в целом хорошо подходит для моих проектов (или моих заблуждений).
Недавно я начал использовать boost::interprocess::message_queue, и это тоже отличный инструмент.
Я бы использовал гораздо больше, но у Qt есть собственные способы делать много вещей, которые делает Boost. Если бы мне когда-нибудь пришлось программировать чистый C++, я бы, наверное, стал boost::junkie :)
Из интереса, что мешало вам написать собственную функцию «конвертировать число в строку» до того, как вы использовали Boost? Я бы увидел дублирование, написал простой шаблон и использовал его, а затем, возможно, переключился на версию с ускорением, когда нашел его ...