Najczęściej używane części Boost [zamknięte]


116

Kiedy odkryłem boost::lexical_cast, pomyślałem sobie „dlaczego nie wiedziałem o tym wcześniej!” - Nienawidziłem pisania kodu

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

Teraz piszę

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

Wczoraj na stackoverflow natknąłem się na Boost Split (kolejny klejnot, który pozwoli mi zaoszczędzić na pisaniu kodu).

string stringtobesplit = "AA/BB-CC")
vector<string> tokens;

boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); 
// tokens now holds 3 items: AA BB CC

Zacznę przeglądać dokumentację doładowania, szukając innych funkcji, z których będę mógł regularnie korzystać, ale czuję, że bardzo łatwo będzie coś przeoczyć.

Jakich funkcji doładowania używasz najczęściej / których nie chciałbyś mieć?


1
Z ciekawości, co powstrzymało Cię przed pisaniem własnej funkcji „zamień liczbę na łańcuch” przed użyciem funkcji Boost? Widziałem duplikację i napisałem prosty szablon i użyłem go, a potem, być może, przełączyłem się na wersję boost, kiedy ją znalazłem ...
Len Holgate

4
Cześć Len, W różnych momentach w różnych projektach pisałem funkcję „ToStr” opartą na szablonie, ale potem przechodziłem do innego projektu, a potem pisałem 3-liniowy tekst, ponieważ chciałem po prostu załatwić tę cholerną rzecz: - ) w przeciwieństwie do narzutu związanego z tworzeniem pliku „misc_funcs”
hamishmcn

Odpowiedzi:


62

Prawdopodobnie najczęściej używaną częścią boostu jest dla mnie boost :: shared_ptr .


13
Prawdopodobnie również najbardziej nadużywany. Sam nauczyłem się tej lekcji na własnej skórze, zmuszając się do refaktoryzacji większości zastosowań shared_ptr przez odwołania, kontenery wskaźników i auto_ptr. I teraz w większości się z tym: bureau14.fr/blogea/index.php/2009/08/...
Amit

1
@phaedrus: Aktualizacja łącza: blogea.bureau14.fr/index.php/2009/08/...
MatthewD

4
Nie ma już znaczenia w C ++ 11, który ma std::shared_ptri std::unique_ptr.
einpoklum


35

Moje ulubione to, w przypadkowej kolejności:

  • wyrażenie regularne
  • system plików
  • wątek
  • lexical_cast
  • program_options (po prostu genialne!)
  • test (dla wszystkich moich potrzeb związanych z testowaniem jednostkowym).
  • Algorytmy ciągów
  • Tokenizer ciągu
  • format (bezpieczne formatowanie napisów w stylu printf)
  • smart ptrs

Boost był ogromną pomocą, kiedy napisałem swoją pierwszą aplikację wieloplatformową - bez niej naprawdę miałbym problemy.


4
Proszę zaktualizować dla C ++ 11 / C ++ 14 ...
einpoklum

28

Podoba mi się, jak możesz dostarczyć własnego destruktora shared_ptr.
Oznacza to na przykład, że możesz go użyć z FILE*i zmusić do zamknięcia pliku.
na przykład

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
Wiem, że minęły prawie dwa lata, ale ... to przypisanie NULLjest bezużyteczne, ponieważ przypisuje parametr funkcji lokalnej. :)
Xeo,

1
Dzięki @Xeo, usunąłem go
hamishmcn

22

Nikt nie wspomniał o kontenerach z wieloma indeksami, więc zadzwonię późno. Nie jest tak często, że ich potrzebujesz, ale bez wzmocnienia tworzenie równoważnej struktury danych jest bardzo trudne, a także mniej wydajne. Ostatnio często ich używałem do tworzenia kontenerów, które wyszukują 2 klucze.


20

Dziwię się, że nikt o tym nie wspomniał boost::optional. Używam go częściej niż jakiejkolwiek części Boost, z wyjątkiem shared_ptri scoped_ptr.


1
Teraz dostępny jako std::experimental::optionali wkrótce (C ++ 17?) Jako std::optional.
einpoklum

1
Tak, i bardzo mnie to cieszy. :-) Chociaż biorąc pod uwagę opóźnienie między standardami i ich pełną implementacją we wszystkich kompilatorach, których używam, minie trochę czasu, zanim będę mógł na tym polegać ... Mogłem po prostu zacząć używać C ++ 11 na projekt w zeszłym roku. :-(
Head Geek

Właściwie myślę, że większość kompilatorów jest w porządku, jeśli chodzi o spełnianie standardów w ostatnich latach - GCC i clang wspierały C ++ 14, kiedy zostało wydane, prawda? W każdym razie rozważ włączenie komentarza do odpowiedzi.
einpoklum

@HeadGeek Ciekawe, że po 8 latach do Twojej odpowiedzi dodano nowy komentarz, a Ty odpowiedziałeś!
Deqing

Wow ... myślę, że ma już osiem lat. Jak mówi Żaba Kermit, czas jest zabawny, gdy masz muchy. ;-)
Head Geek

19

Nikt nie wspomina o boostie :: tuple? Wstyd!


2
Teraz dostępny jako std::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

Aktualizacja (październik 2011): C ++ 11 (C ++ 0x) ma static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSG pozwala na bardzo łatwe odczytanie / wykrycie błędów, które są znacznie bardziej pouczające niż rozmiar niekompletnego typu wiadomości, który daje BOOST_STATIC_ASSERT.
KitsuneYMG

tutaj tutaj! Właśnie znalazłem jeden z tych niekompletnych błędów typu w makrze testującym BOOST_CHECK_CLOSE - zajęło mi pół dnia, zanim zrozumiałem, co się dzieje, zanim zacząłem go nazwać (int, int, float); kiedy rzuciłem liczby całkowite na zmiennoprzecinkowe, błąd zniknął. Ale co to ma wspólnego z niekompletnym typem, naprawdę nie wiem :)
Jamie Cook

9

Jednym z najczęściej używanych przeze mnie nie jest poprawne Boost, ale Adobe Source Libraries (ASL) zbudowane na bazie Boost - w szczególności rozszerzenia standardowych algorytmów, które akceptują wzmocnienie :: range zamiast oddzielnych iteratorów początku / końca. Wtedy zamiast dzwonić, powiedz:

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

Mogę po prostu powiedzieć

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

(Mam nadzieję, że te części ASL w końcu przejdą na Boost.)


Podoba mi się, sprawdzę ASL
hamishmcn

8

Używam dużo:

  • boost :: sygnały
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bind
  • boost :: random
  • boost :: thread
  • boost :: noncopyable

Inne, takie jak Tuple, Static Assert i Integer, są bardzo przydatne, jeśli piszesz bibliotekę, która ma być używana na różnych platformach.

Rzeczy takie jak wykresy i Lambda są bardziej szczegółowe.


Zaktualizuj C ++ 11/14 na te dni (lub rozważ usunięcie odpowiedzi).
einpoklum

8

boost::shared_ptrjest wymogiem dla nowoczesnego programowania IMHO w C ++. Dlatego dodali go do standardu z TR1. boost::program_options, boost::bindi boost::signalsą naprawdę fajne, jeśli wiesz, do czego służą i jak ich używać. Dwie ostatnie mają jednak tendencję do straszenia nowoprzybyłych.


7

Okazało się, że funkcja boost :: spirit jest całkiem przydatna w rozwiązaniu biznesowym do analizowania ECMAScript. Złożone, ale bardzo ładne!



7

Używam shared_ptr od lat. Jest po prostu tak przydatny, że nie ma powodu, aby projekt był bez niego.

Co więcej, używam również Bind / Function / Lambda do ogólnych mechanizmów wywołania zwrotnego - szczególnie przydatnego podczas testowania - a także Format do mojego zamiennika sprintf ogólnego przeznaczenia.

Wreszcie, dopiero niedawno użyłem Variant w złości, aby rozwiązać problem (parser, który mógł odpowiedzieć za pomocą małego, ustalonego zestawu niepowiązanych typów tokenów). Rozwiązanie było bardzo eleganckie i jestem z niego bardzo zadowolony.


Minęły lata i czasy się zmieniły, więc czas na aktualizację. SharedPtr i Function są teraz częścią standardu, a Bind i Lambda są przestarzałe przez rzeczywistą funkcjonalność lambda na poziomie języka.

Nadal używam Variant (który również został ustandaryzowany, ale jeszcze tam nie jestem), format jest w dużej mierze zastępowany przez fmtlib (który również został ustandaryzowany).

Duża część Boost, której używam, to Boost.Asio. Który jest w trakcie standaryzacji.


1
Zgadzam się ze wszystkimi powyższymi - z wyjątkiem Lambdy. Używałem go przez jakiś czas, ale jest tak zawiły, że porzuciłem go dla wszystkich oprócz najprostszych wyrażeń. Z niecierpliwością czekam na C ++ 0x i jego formę wyrażeń lambda.
Head Geek

Zgadzam się, że Boost.Lambda jest pełna wszelkiego rodzaju pułapek - jak tylko wkroczę do królestwa Unlambda lub Protect, poddaję się i robię to po staremu, ale wydaje się to niezbędne do przedłużania callbacków w jakikolwiek na wpół przyzwoity sposób . To powiedziawszy, ja też czekam na implementację C ++ 0x.
Kaz Dragon

6

Używanie krotek do iteracji mapy, na przykład:

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

Korzystając z przypisania doładowania, mogę zainicjować mapę w następujący sposób:

map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");

Używając adapterów zakresu i operatora potoku („|”) mogę iterować wstecz po wartościach mapy (jako przykład):

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }

1
To jest naprawdę fajne. Sprawiło,
hamishmcn

5

Powinieneś sprawdzić boost :: program_options. To znacznie ułatwia analizowanie wiersza poleceń.


5

Używam kontenerów Boost Pointer Containers zamiast kontenera STL shared_ptrs.



3

Uwielbiam boost :: random i boost :: asio i boost :: filesystem, jednak boost :: bind, boost :: round_buffer i boost :: thread są bardzo praktyczne, inteligentne wskaźniki są w porządku, ale wolę RAII zamiast zarządzania pamięcią


6
Inteligentne wskaźniki to RAII.
Eclipse

4
dokładniej, inteligentne wskaźniki dają RAII, gdy nie ma innego wyboru, jak tylko dynamicznie alokować pamięć.
Branan

3

Okay, oto nowy, który znalazłem:
Zamiast używać stricmp mogę użyć funkcji equals boost i przekazać w predykacie is_iequal,
np .:
zamiast

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

mogę użyć

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

dany:

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

3

Oto moje dwa centy:

  • boost :: scope_exit - nie ma potrzeby definiowania klasy RAII tylko do jednego użycia
  • boost :: any
  • boost :: variant
  • Wzmocnij bibliotekę kontenerów wskaźników (ptr_vector)
  • Zwiększ bibliotekę puli
  • boost :: unordered_map / boost :: unordered_set

3

Używam boost::icldużo do przetwarzania tekstu. Zaoszczędziło mi to sporo czasu, bo inaczej musiałbym sam zaimplementować dzielenie tekstu ...

BOOST_FOREACH jest wszędzie w moim kodzie :)

boost::functioni boost::bindsą absolutną koniecznością. Chociaż teraz są std::functioni std::bind. To naprawdę pomaga zmniejszyć ilość niepotrzebnego kodu i ogólnie jest dobre dla moich projektów (lub moich złudzeń).

Niedawno zacząłem używać boost::interprocess::message_queuei jest to również świetne narzędzie.

Używałbym znacznie więcej, ale Qt ma natywne sposoby robienia wielu rzeczy, które robi Boost. Gdybym kiedykolwiek musiał programować w czystym C ++, myślę, że zostałbym boost::junkie:)


3

To, czego używam najczęściej, jest teraz dostępne w TR1:

  • wspólne wskaźniki
  • klasa tablicy

Teraz używam również zajęć z puli i kilku innych bardziej szczegółowych rzeczy.

Rozumiesz teraz, że Boost ma być przydatny dla większości programistów, dlatego jest polem testowym dla przyszłej biblioteki standardowej.


1

Mówiąc o boost :: lexical_cast, dlaczego coś takiego jak „format” nie jest statycznym składnikiem w bibliotece std :: string?
Prawie wszystkie biblioteki gui mają coś takiego jak CString :: Format ("% i") lub QString :: Number ("% i"), które zwracają zainicjowany ciąg.


4
np .: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Rob

Jeśli chcesz zrezygnować z bezpieczeństwa typów, możesz rzucić własne za pomocą vsnprintf (), wielokropka (...), va_list / stdarg.h i lokalnego (opartego na stosie) bufora.
Pan Ree

2
std :: string ma już 71 funkcji za dużo (według liczby Herba Suttera, nie mojej). Zobacz gotw.ca/gotw/084.htm po szczegóły: Myślę, że ma wystarczająco dużo informacji, aby wyjaśnić (a) dlaczego format nie musi znajdować się w std :: string i (b) dlaczego lepiej jest pisać algorytmy generyczne niż składowe klasy i tak funkcjonuje.
Steve Jessop

4
Innymi słowy: „C ++ jest jak obcy kraj: tam robią rzeczy inaczej” ;-)
Steve Jessop

1
Format nie jest częścią biblioteki, ponieważ jednym z wyzwań, jakie postawił Stroustrup podczas projektowania C ++, była konstrukcja bezpiecznej dla typów biblioteki I / O z formatowaniem. Oczywiście wynik był taki, jaki widzisz w iostreamach. Najwyraźniej nikt wtedy nie pomyślał o interpolacji. Może ktoś chciałby napisać strumień formatów, aby tradycjonaliści czuli się bardziej jak w domu?
Phil Miller

1

Myślę, że pytanie powinno zostać odwrócone. Której części twojego boostu nie chciałbyś używać?

Z mojego doświadczenia wynika, że ​​prawie wszystko jest interesujące i przydatne w każdej problematycznej domenie.

Powinieneś poświęcić czas na rozejrzenie się po dokumentacji doładowania, aby znaleźć obszary, które obejmują twoje zainteresowania.

Jedynym wyjątkiem może być boost::numeric::ublasto, że spełnia swoje zadanie, ale Eigen robi to znacznie lepiej.


Wątpię, by wielu ludzi korzystało z biblioteki octonion.
Petter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.