Ответ 1
Вероятно, самая используемая часть boost для меня - boost:: shared_ptr.
Когда я обнаружил 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:: shared_ptr.
BOOST_FOREACH делает жизнь полезной снова.
(Почему никто не упоминал об этом? Вопрос был задан 8 месяцев назад!)
Мои любимые объекты не имеют особого порядка:
Boost была огромной помощью, когда я написал свое первое кросс-платформенное приложение - без него я бы действительно боролся.
Мне нравится, как вы можете предоставить свой собственный деструктор для 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" );
}
Никто не упомянул Multi-Index Containers, поэтому я буду звонить в последнее время. Это не так часто, что вы в них нуждаетесь, но без повышения - это настоящая боль, чтобы создать эквивалентную структуру данных, а также быть менее эффективной. Я недавно использовал их для создания контейнеров, которые смотрят на 2 клавиши.
Я удивлен, что никто не упомянул boost::optional
. Я использую его чаще, чем любая часть Boost, кроме shared_ptr
и scoped_ptr
.
Никто не упоминает boost:: tuple? Для стыда!
Обновление (октябрь 2011 г.): С++ 11 (С++ 0x) имеет static_assert
http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert
Один из моих наиболее используемых - не в 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 в конце концов.)
Я использую много:
Другие, такие как Tuple, Static Assert и Integer, очень полезны, если вы пишете библиотеку, которая должна использоваться на разных платформах.
Такие вещи, как графики и лямбда, более конкретны.
boost::shared_ptr
- это требование для современного программирования на языке С++ IMHO. Вот почему они добавили его в стандарт с TR1. boost::program_options
, boost::bind
и boost::signal
действительно приятны, если вы знаете, для чего они предназначены и как их использовать. Последние два, как правило, пугают новичков.
Мы нашли boost:: spirit довольно полезным для бизнес-решения для анализа ECMAScript. Сложный, но очень приятный!
Я удивлен, пока не вижу между ответами Boost.Thread.
Я использую shared_ptr уже много лет. Это настолько полезно, что нет причин, чтобы проект был без него.
Кроме того, я также использую Bind/Function/Lambda для общих механизмов обратного вызова, особенно полезно при тестировании, а также для формата для замены общего спринтфа.
Наконец, на днях я использовал Вариант в гневе для решения проблемы (парсер, который мог бы ответить небольшим фиксированным набором несвязанных типов токенов). Решение было очень элегантным, и я очень доволен этим.
Вы должны проверить boost:: program_options. Это облегчает синтаксический анализ командной строки.
Я использую контейнеры-указатели Boost, предпочитая контейнер STL shared_ptr
s.
Использование кортежей для итерации карты, например:
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) { ... }
Я использую boost:: numeric:: ublas:: matrix довольно много.
То, что я использую больше всего, теперь доступно в TR1:
Теперь я также использую классы пула и некоторые другие более конкретные вещи.
Теперь вы понимаете, что повышение должно быть полезным большинству программистов, поэтому это тестовая площадка для будущей стандартной библиотеки.
Мне нравится boost:: random и boost:: asio и boost:: filesystem, однако boost:: bind, boost:: circle_buffer и boost:: thread очень практичны, умные указатели в порядке, но я предпочитаю RAII вместо памяти управление
Хорошо, вот новый, который я нашел:
Вместо использования 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;
Вот мои два цента:
Я использую boost:: icl довольно много для пост-обработки текста. Сэкономил мне довольно много времени, потому что в противном случае мне пришлось бы реализовать расщепление текста...
BOOST_FOREACH везде в моем коде:)
boost:: function и boost:: bind - это абсолютная необходимость. Хотя теперь они являются std:: function и std:: bind. Они действительно помогают уменьшить количество ненужного кода и просто хороши для моих проектов (или моих заблуждений).
Недавно я начал использовать boost:: interprocess:: message_queue, и это отличный инструмент.
Я бы использовал намного больше, но у Qt есть родные способы сделать много вещей. Если мне когда-либо понадобится программировать чистый С++, я думаю, я бы стал boost:: junkie:)
Говоря об boost:: lexical_cast, почему не что-то вроде "format" статического члена в библиотеке std::string?
Почти все gui libs имеют что-то вроде CString:: Format ( "% i" ) или QString:: Number ( "% i" ), которые возвращают инициализированную строку.
Я думаю, вопрос должен быть отменен. Какую часть вы повышаете, не хотите ли вы использовать?
В моем опыте почти все это интересно и полезно в каждой проблемной области.
Вы должны тратить время на поиск документации, чтобы найти области, которые охватывают ваши интересы.
Одним исключением может быть boost::numeric::ublas
, который выполняет свою работу, но Eigen делает это замечательно лучше.