Большинство используемых частей 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 109

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.

никто не упоминает boost:: кортеж? Как не стыдно!

BOOST_STATIC_ASSERT

обновление (октябрь 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 в предпочтении к контейнеру STL shared_ptr s.

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