Найчастіше використовувані частини Boost [закрито]


115

Коли я виявив, 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? Я бачив дублювання і написав простий шаблон і використав це, а потім, можливо, перейшов на інноваційну версію, коли знайшов її ...
Лен Холгейт

4
Привіт Лен, я в різні часи для різних проектів писав шаблонову функцію "ToStr", але тоді я перейшов би на якийсь інший проект, а потім закінчив написання 3-лайнера, тому що я просто хотів зробити чортову справу: - ) на відміну від накладних витрат на створення файлу "misc_funcs"
hamishmcn

Відповіді:


62

Напевно, найбільш використовуваною частиною прискорення для мене є boost :: shared_ptr .


13
Також, мабуть, більшість переживаних. Я сам засвоїв урок важким способом, довевши рефакторинг більшості звичаїв shared_ptr за посиланнями, контейнерами вказівників та auto_ptr. Зараз я в основному згоден з цим: bureau14.fr/blogea/index.php/2009/08 / ...
Amit

1
@phaedrus: оновлене посилання: blogea.bureau14.fr/index.php/2009/08/…
MatthewD

4
Більше не стосується C ++ 11, яка має std::shared_ptrта std::unique_ptr.
einpoklum

49

BOOST_FOREACH знову робить життя цінним.

(Чому про це ніхто не згадував? Питання було задано 8 місяців тому!)


15
У статті Еріка Ніблера на тему "Умовна любов" ( artima.com/cppsource/foreach.html ) описано, як працює BOOST_FOREACH. Це досить божевільно.
Джефф Харді

2
Більше не так популярний C ++ 11 та лямбда ...
einpoklum

34

Мої фаворити - це не в певному порядку:

  • регекс
  • файлова система
  • нитка
  • lexical_cast
  • program_options (просто геніально!)
  • тест (для всіх моїх потреб у тестуванні одиниць).
  • Строкові алгоритми
  • Струнний токенізатор
  • формат (безпечне для тексту форматування друку в стилі printf)
  • розумні ptrs

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


4
Оновіть для C ++ 11 / C ++ 14 ...
einpoklum

28

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

1
Я знаю, що це майже два роки пізніше, але ... це призначення NULLмарно, оскільки призначає параметр локальної функції. :)
Xeo

1
Дякую @Xeo, я його видалив
hamishmcn

22

Ніхто не згадав мультиіндексні контейнери, тож я задзвонюся пізно. Не так часто вони вам потрібні, але без їх підсилення - справжній біль створити еквівалентну структуру даних, а також бути менш ефективною. Нещодавно я їх використовую для створення контейнерів, які шукають дві клавіші.


20

Я здивований, що ніхто не згадав boost::optional. Я вважаю, що використовую його частіше, ніж будь-яку частину Boost за винятком shared_ptrі scoped_ptr.


1
Тепер доступний як std::experimental::optionalі незабаром (C ++ 17?) Як std::optional.
einpoklum

1
Так, і я дуже радий цьому. :-) Хоча зважаючи на затримку між стандартами та повну реалізацію їх у всіх компіляторах, які я використовую, це ще пройде деякий час, перш ніж я можу від цього залежати ... Мені просто вдалося почати використовувати C ++ 11 на проект минулого року. :-(
Head Geek

Насправді я думаю, що більшість компіляторів нормально відповідають стандартам Wrt за останні роки - GCC та clang підтримували C ++ 14, коли він вийшов, чи не так? У будь-якому разі, будь ласка, подумайте про інтеграцію свого коментаря у свою відповідь.
einpoklum

@HeadGeek Цікаво побачити новий коментар до вашої відповіді через 8 років, і ви відповіли!
Декін

Нічого ... я думаю , минуло вісім років. Як каже Керміт Жаба, час весело, коли у вас мухи. ;-)
Head Geek


11

BOOST_STATIC_ASSERT

Оновлення (жовтень 2011 р.): C ++ 11 (C ++ 0x) має static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSG дозволяє дуже легко читати / виявляти помилки, які набагато інформативніші, ніж розмір неповного типу типу, який дає BOOST_STATIC_ASSERT.
KitsuneYMG

ось тут! Щойно я виявив одну з цих неповних помилок типу всередині тестового макросу BOOST_CHECK_CLOSE - мені знадобилося півдня, щоб зрозуміти, що відбувається до того, як я покрутив, що я його викликав (int, int, float); як тільки я кинув цілі числа до плаваючої точки, помилка пішла. Але що це стосується неповного типу, я насправді не знаю :)
Джеймі Кук,

9

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

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

Я можу просто сказати

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

(Я сподіваюся, що ці частини ASL з часом мігрують до Boost.)


Мені це подобається, я перевіряю ASL
hamishmcn

8

Я багато використовую:

  • boost :: сигнали
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: прив’язувати
  • boost :: випадковий
  • boost :: нитка
  • boost :: не можна скопіювати

Такі, як Tuple, Static Assert та Integer, дуже корисні, якщо ви пишете бібліотеку, яка має використовуватися на різних платформах.

Такі речі, як "Графіки" та "Лямбда", більш конкретні.


Будь ласка, оновіть на ці дні C ++ 11/14 (або подумайте про видалення відповіді).
einpoklum

8

boost::shared_ptrє вимогою до сучасного C ++ програмування IMHO. Тому вони додали його до стандарту з TR1. boost::program_options, boost::bindі boost::signalдуже приємні, якщо ви знаєте, для чого вони призначені та як ними користуватися. Останні два, як правило, лякають новачків.


7

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



7

Я вже кілька років використовую shared_ptr. Це просто так корисно, що немає причин, що проект повинен бути без нього.

Крім того, я також використовую Bind / Function / Lambda для загальних механізмів зворотного виклику - особливо корисних під час тестування - а також Format для моєї заміни sprintf загального призначення.

Нарешті, якраз днями я застосував Variant у гніві для вирішення проблеми (аналізатор, який міг би відповісти невеликим, фіксованим набором непов'язаних типів лексем). Рішення було дуже елегантним, і я дуже задоволений цим.


Пройшли роки, а часи змінилися, тому час для оновлення. SharedPtr і Function тепер є частиною стандарту, а Bind і Lambda застаріли завдяки фактичній функціональності лямбда на рівні мови.

Я все ще використовую Variant (який також був стандартизований, але мене там ще немає), Формат значною мірою замінений fmtlib (який також був стандартизований).

Велика частина Boost, яку я використовую, - Boost.Asio. Який у процесі стандартизації.


1
Я згоден з усім вищесказаним - крім Ламбди. Я деякий час використовував його, але він настільки мутний, що я відмовився від нього, окрім найпростіших виразів. З нетерпінням чекаємо C ++ 0x та його форму лямбда-виразів.
завідувач Geek

Я погоджуюся, що Boost.Lambda сповнений всіляких підводних каменів - як тільки я входжу в царства Unlambda або Protect, я відмовляюся від цього і роблю це по-старому, але це здається важливим для розширення зворотних зворотів будь-яким напівпристойним способом . Однак, я теж чекаю впровадження C ++ 0x.
Kaz Dragon

6

Використовуючи кортежі для ітерації карти, як це:

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

Використовуючи присвоєння прискорення, я можу ініціалізувати карту так:

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

1
Це дійсно круто. Я змусив мене прочитати документацію для призначення прискорення: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn


5

Я використовую контейнери Boost Pointer, які віддають перевагу контейнеру STL shared_ptr.



3

Я люблю boost :: random and boost :: asio and boost :: fileystem, but boost :: bind, boost :: circular_buffer and boost :: thread дуже практичні, розумні покажчики в порядку, але я віддаю перевагу RAII, а не як управління пам'яттю


6
Смарт-покажчики - RAII.
Eclipse

4
точніше, смарт-покажчики дають RAII, коли не залишається іншого вибору, як динамічно розподіляти пам'ять.
Бранан

3

Гаразд, ось новий, який я знайшов:
замість Stricmp я можу використовувати функцію boost's equals і передавати в предикат is_iequal,
наприклад:
замість

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

Я можу використовувати

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

дано:

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

3

Ось два мої центи:

  • boost :: range_exit - не потрібно визначати клас RAII лише для одного використання
  • boost :: будь-який
  • boost :: варіант
  • Бібліотека контейнерів для підвищення покажчика (ptr_vector)
  • Бібліотека збільшити басейн
  • boost :: unordered_map / boost :: unordered_set

3

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

BOOST_FOREACH є мій код :)

boost::functionі boost::bindє абсолютною необхідністю. Хоча зараз вони є std::functionі std::bind. Вони справді допомагають зменшити кількість непотрібного коду і просто загалом корисні для моїх конструкцій (або моїх марень).

Я нещодавно почав використовувати, boost::interprocess::message_queueі це чудовий інструмент теж.

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


3

Що я найбільше використовую, зараз доступне в TR1:

  • спільні покажчики
  • клас масиву

Зараз я також використовую класи в басейні та деякі інші більш конкретні речі.

Тепер ви розумієте, що Boost призначений для користі для більшості програмістів, тому це тестовий блок для майбутньої стандартної бібліотеки.


1

Якщо говорити про boost :: lexical_cast, чому не щось подібне до "форматування" статичного члена в бібліотеці std :: string?
Майже у всіх lii-файлах є щось на зразок CString :: Format ("% i") або QString :: Number ("% i"), які повертають ініціалізований рядок.


4
наприклад: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Роб

Якщо ви готові відмовитись від безпеки типу, ви можете скатати свої власні кнопки vsnprintf (), ellipsis (...), va_list / stdarg.h та локальний буфер (на основі стека).
Mr.Ree

2
std :: string вже має 71 функцію занадто багато (за підрахунками Герба Саттера, не моєї). Докладні відомості див. У розділі gotw.ca/gotw/084.htm : я думаю, у нього є достатньо інформації, щоб пояснити (а) чому формат не повинен бути в std :: string та (b) чому краще писати загальні алгоритми, ніж член класу функціонує все одно.
Стів Джессоп

4
Або кажучи інакше, "C ++ - це як іноземна країна: там вони роблять інакше" ;-)
Стів Джессоп

1
Формат не є частиною бібліотеки, оскільки однією з проблем, яку поставив Stroustrup під час проектування C ++, було побудова безпечної для друку формату бібліотеки вводу / виводу. Очевидно, результатом було те, що ви бачите з iostreams. Мабуть, тоді ніхто не думав про інтерполяцію. Можливо, хтось хотів би написати потік форматів, щоб традиціоналісти почували себе більше як вдома?
Філ Міллер

1

Я думаю, що питання слід змінити. Яку частину з них ви не хочете використовувати?

На мій досвід, усе це цікаво і корисно у кожній проблематичній галузі.

Ви повинні витратити час на перегляд документації щодо покращення, щоб знайти сфери, що охоплюють ваші інтереси.

Винятком може бути те, boost::numeric::ublasщо це робить свою роботу, але Ейген робить це надзвичайно краще.


Сумніваюся, бібліотека октоніонів використовується багатьма.
Петтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.