Большинство используемых частей 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, ища другие функции, которые я смогу использовать регулярно, но я чувствую, что это будет очень легко пропустить что-то.
какие функции повышения вы используете больше всего / не хотели бы иметь?
25 ответов:
вероятно, наиболее часто используемая часть boost для меня является boost:: shared_ptr.
BOOST_FOREACH снова наполняет жизнь смыслом.
(Почему никто не упомянул об этом? Вопрос был задан 8 месяцев назад!)
мои фавориты, в определенном порядке:
- выражение
- файловой системы
- thread
- lexical_cast
- program_options (просто гениально!)
- тест (для всех моих потребностей модульного тестирования).
- строковые алгоритмы
- строковый токенизатор
- формат (типобезопасное форматирование строки в стиле printf)
- smart ptrs
повышение было a огромная помощь, когда я написал свое первое кросс-платформенное приложение - без него я бы боролся.
мне нравится, как вы можете поставить свой собственный деструктор
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" ); }
никто не упомянул Многоиндексные Контейнеры Так что я буду звонить в конце. Это не так часто, что вы нуждаетесь в них, но без повышения это реальная боль, чтобы создать эквивалентную структуру данных, а также быть менее эффективным. Я использую их много в последнее время для создания контейнеров, которые имеют поиск по 2 ключам.
Я удивлен, что никто не упомянул
boost::optional
. Я обнаружил, что использую его чаще, чем любую часть Boost, кромеshared_ptr
иscoped_ptr
.
обновление (октябрь 2011): C++11 (C++0x) имеет
static_assert
http://www2.research.att.com/~bs / C++0xFAQ. html#static_assert
один из моих наиболее часто используемых не в Boost собственно, но Adobe Source Libraries (ASL) построенный поверх Boost-в частности, расширения стандартных алгоритмов, которые принимают диапазон boost:: вместо отдельных итераторов begin/end. Тогда вместо звонка, скажем,
std::for_each(some_container.begin(), some_container.end(), do_something());
Я могу просто сказать
adobe::for_each(some_container, do_something());
(Я надеюсь, что эти части ASL мигрируют, чтобы повысить в конечном итоге.)
Я использую много:
- boost:: сигналы
- boost:: shared_ptr
- boost:: lexical_cast
- boost:: bind
- boost:: random
- boost:: thread
- boost:: noncopyable
другие, такие как кортеж, статическое утверждение и целое число, очень полезны, если вы пишете библиотеку, которая должна использоваться на различных платформах.
такие вещи, как графики и лямбда, более конкретны.
boost::shared_ptr
Это требование для современного программирования на C++ IMHO. Вот почему они добавили его в стандарт с TR1.boost::program_options
,boost::bind
иboost::signal
очень приятно, если вы знаете, для чего они и как их использовать. Последние два, как правило, пугают новичков.
мы нашли boost:: spirit довольно полезным для бизнес-решения для разбора ECMAScript. Сложный, но очень приятный!
Я удивлен, что еще не вижу между ответами импульс.Нить.
Я использую shared_ptr уже много лет. Это так полезно, нет никаких причин, что проект должен быть без него.
кроме того, я также использую Bind/Function/Lambda для общих механизмов обратного вызова-особенно полезно при тестировании-а также формат для моей замены sprintf общего назначения.
наконец, это было только на днях, когда я использовал Variant In anger для решения проблемы (парсер, который мог бы ответить небольшим фиксированным набором несвязанных токенов типы.) Решение было очень элегантным, и я очень доволен им.
вы должны проверить boost:: program_options. Это делает синтаксический анализ командной строки намного проще.
использование кортежей для итерации карты, например:
string key, value; BOOST_FOREACH(tie(key, value), my_map) { ... }
используя boost assign, я могу инициализировать карту следующим образом:
map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");
и с помощью адаптеров диапазона и оператора pipe ("| " ) я могу выполнить итерацию назад по значениям карты(в качестве примера):
BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }
Я использую boost:: numeric:: ublas:: matrix совсем немного.
то, что я использую больше всего, теперь доступно в TR1:
- общие указатели
- массив класс
теперь я также использую классы пула и некоторые другие более конкретные вещи.
теперь вы понимаете, что boost должен быть полезен для большинства программистов, поэтому это тестовый стенд для будущей стандартной библиотеки.
Я люблю наддува::случайный и boost::asio и в Boost::файловая система, однако повышение::связать , то Boost::circular_buffer и Boost::нить очень практичные, умные указатели-это хорошо, но я предпочитаю РАИИ, а не как управление памятью
хорошо, вот новый, который я нашел:
Вместо того, чтобы использовать stricmp Я могу использовать boost в равна функция и передать в is_iequal предикат
например:
вместоstricmp( "avalue", mystr.c_str() ) == 0
Я могу использовать
equals( "avalue", mystr, is_iequal() )
дано:
#include <boost/algorithm/string.hpp> using namespace boost::algorithm;
вот мои два цента:
- boost:: scope_exit - нет необходимости определять класс RAII только для одного использования
- boost:: any
- boost:: variant
- Boost Pointer Container Library (ptr_vector)
- Boost Pool Library
- boost:: unordered_map / boost:: unordered_set
Я использую boost:: icl довольно много для пост-обработки текста. Это сэкономило мне довольно много времени, потому что в противном случае мне пришлось бы реализовать разделение текста самостоятельно...
BOOST_FOREACH есть везде в моем коде:)
boost::function и boost:: bind являются абсолютной необходимостью. Хотя теперь они являются std::function и std:: bind. Они действительно помогают уменьшить количество ненужного кода и просто хороши для моих проектов(или моих заблуждений).
Я недавно начал использование boost::interprocess:: message_queue и это тоже отличный инструмент.
Я бы использовал намного больше, но Qt имеет собственные способы делать много вещей, которые делает boost. Если бы мне когда-нибудь пришлось программировать чистый c++, я думаю, я бы стал boost::junkie :)
говоря о boost::lexical_cast, почему что-то вроде 'format' не является статическим членом в библиотеке std:: string?
Почти все библиотеки gui имеют что-то вроде CString::Format("%i") или QString::Number("%i"), которые возвращают инициализированную строку.
Я думаю, что вопрос должен быть отменен. Какая часть вас повысить бы вы не хочу использовать ?
по моему опыту в значительной степени все это интересно и полезно в каждой проблемной области.
вы должны потратить время на просмотр всей документации boost, чтобы найти области, которые охватывают ваши интересы.
одно исключение может быть
boost::numeric::ublas
который делает свою работу, но собственные это заметно лучше.