Наиболее часто используемые части 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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

Мои любимые объекты не имеют особого порядка:

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

Никто не упоминает boost:: tuple? Для стыда!

Ответ 9

Один из моих наиболее используемых - не в Boost, но Adobe Source Libraries (ASL), построенный на вершине Boost - в частности, расширения стандартных алгоритмов, принимающих boost:: range вместо отдельных итераторов begin/end. Затем вместо вызова, скажем,

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

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

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

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

Ответ 10

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

  • подталкивание:: сигналы
  • повышение:: shared_ptr
  • подталкивание:: lexical_cast
  • повышение:: связать
  • подталкивание:: случайное
  • подталкивание:: нить
  • подталкивание:: noncopyable

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

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

Ответ 11

boost::shared_ptr - это требование для современного программирования на языке С++ IMHO. Вот почему они добавили его в стандарт с TR1. boost::program_options, boost::bind и boost::signal действительно приятны, если вы знаете, для чего они предназначены и как их использовать. Последние два, как правило, пугают новичков.

Ответ 12

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

Ответ 13

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

Ответ 14

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

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

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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

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

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

Ответ 19

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

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

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

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

Ответ 20

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

Ответ 21

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

Ответ 22

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

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

Ответ 23

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

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

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

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

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

Ответ 24

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

Ответ 25

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

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

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

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