2008-11-28 2 views
105

Когда я обнаружил boost::lexical_cast, я подумал: «Почему я не знал об этом раньше!» - Я терпеть не мог, чтобы писать код какСамые используемые детали Boost

stringstream ss; 
ss << anIntVal; 
mystring = ss.str(); 

Сейчас я пишу

mystring = boost::lexical_cast<string>(anIntVal); 

Вчера на StackOverflow, я наткнулся на повышающего раскол (другой драгоценный камень, который спасет меня писать код).

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? Я бы увидел дублирование и написал простой шаблон и использовал это, а затем, возможно, переключился на ускоренную версию, когда нашел ее ... – 2008-11-29 09:35:00

+4

Привет, Len, В разное время по разным проектам я написал шаблонный «ToStr», но потом я перейду к другому проекту, а затем напишу 3-лайнер, потому что я просто хотел получить чертовую вещь :-) в отличие от накладных расходов на создание файла «misc_funcs» – hamishmcn 2008-11-29 19:31:04

ответ

59

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

+13

. Также возможно большинство чрезмерная эксплуатация. Я сам усвоил этот урок из-за необходимости рефакторировать большинство обычаев shared_ptr ссылками, контейнерами указателей и auto_ptr. Сейчас я в основном согласен с этим: http://www.bureau14.fr/blogea/index.php/2009/08/smart-pointers-are-overused/ – 2010-06-24 07:58:24

+1

@phaedrus: Обновлена ​​ссылка: https: //blogea.bureau14. fr/index.php/2009/08/smart-pointers-are-overused/ – MatthewD 2013-12-16 23:08:19

+1

Больше не актуально в C++ 11, который имеет `std :: shared_ptr` и` std :: unique_ptr`. – einpoklum 2016-03-25 00:10:38

3

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

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

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

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

3

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

+6

Умные указатели RAII. – Eclipse 2008-11-28 19:19:17

+4

точнее, интеллектуальные указатели дают вам RAII, когда нет выбора, кроме как распределять память динамически. – Branan 2009-02-10 17:54:02

7

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

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

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

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

+0

Обновите данные для этих дней C++ 11/14 (или попробуйте удалить ответ). – einpoklum 2016-03-25 00:13:20

1

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

+0

Проверьте наш формат oost ::. – Rob 2008-11-28 16:02:16

+4

например: `std :: string = boost :: format (" Hello,% 1%% 2% ")%" world "%" !!! "). Str();` – Rob 2008-11-28 16:04:25

+0

Если вы готовы forgo type-safety, вы можете перевернуть свой собственный с помощью vsnprintf(), эллипсиса (...), va_list/stdarg.h и локального (на основе стека) буфера. – 2008-11-28 18:27:18

30

Моего Faves является, в частности, нет порядка: (! Просто гениальна)

  • регулярных выражений
  • filesystem
  • нити
  • lexical_cast
  • program_options
  • тест (для все моего блока требования к тестированию).
  • алгоритмы Струнные
  • Строка токенизатор
  • формат (типобезопасный Printf стиль строки форматирования)
  • смарт PTRS

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

18

Никто не упоминает boost :: tuple? За позор!

7

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

20

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

6

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

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

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

3

Хорошо, вот новый один я нашел:
Вместо использования stricmp я могу использовать подталкивание-х равна функции и передать в is_iequal предиката
например:
вместо

stricmp("avalue", mystr.c_str()) == 0 

я могу использовать

equals("avalue", mystr, is_iequal()) 

Дано:

#include <boost/algorithm/string.hpp> 
using namespace boost::algorithm; 
21

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

47

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

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

26

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

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

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

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

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

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

5

Вы должны проверить повышение :: program_options , Это упрощает синтаксический анализ командной строки.

7

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

5

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

1

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

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

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

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

3

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

  • повышение :: scope_exit - нет необходимости определять класс RAII только для одного использования
  • повышающего :: любой
  • подталкивание :: вариант
  • подталкивания Pointer Контейнер Library (ptr_vector)
  • подталкивания Библиотека бассейн
  • повышение :: unordered_map/повышение :: unordered_set
5

Использование кортежей итерацию карту, как это:

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

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

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

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

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

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

Смежные вопросы