Die am häufigsten verwendeten Teile von Boost [geschlossen]


115

Als ich entdeckte boost::lexical_cast dachte ich mir: "Warum wusste ich nicht früher davon?" - Ich hasste es, Code schreiben zu müssen

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

Jetzt schreibe ich

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

Gestern bin ich beim Stackoverflow auf Boost Split gestoßen (ein weiteres Juwel, das mir das Schreiben von Code erspart).

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

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

Ich werde anfangen, die Boost-Dokumentation nach anderen Funktionen zu durchsuchen, die ich regelmäßig verwenden kann, aber ich denke, dass es sehr leicht sein wird, Dinge zu übersehen.

Welche Boost-Funktionen verwenden Sie am meisten / würden es hassen, nicht zu haben?


1
Was hat Sie aus Interesse davon abgehalten, Ihre eigene Funktion "Nummer in Zeichenfolge konvertieren" zu schreiben, bevor Sie Boost verwendet haben? Ich hätte die Vervielfältigung gesehen und eine einfache Vorlage geschrieben und diese verwendet und dann vielleicht zur Boost-Version gewechselt, als ich sie gefunden habe ...
Len Holgate

4
Hallo Len, zu verschiedenen Zeiten in verschiedenen Projekten habe ich eine "ToStr" -Funktion mit Vorlagen geschrieben, aber dann bin ich zu einem anderen Projekt übergegangen und habe dann den 3-Liner geschrieben, weil ich nur das verdammte Ding erledigen wollte: - ) im Gegensatz zum Aufwand für das Erstellen einer "misc_funcs" -Datei
hamishmcn

Antworten:


62

Der wahrscheinlich am häufigsten verwendete Teil von Boost ist für mich boost :: shared_ptr .


13
Auch wahrscheinlich am meisten überstrapaziert. Ich habe die Lektion auf die harte Tour gelernt, indem ich die meisten Verwendungen von shared_ptr durch Referenzen, Zeigercontainer und auto_ptr umgestalten musste. Ich stimme dem jetzt größtenteils zu: office14.fr/blogea/index.php/2009/08/…
amit

1
@phaedrus: Aktualisierter Link: blogea.bureau14.fr/index.php/2009/08/…
MatthewD

4
In C ++ 11 mit std::shared_ptrund nicht mehr relevant std::unique_ptr.
Einpoklum


34

Meine Favoriten sind in keiner bestimmten Reihenfolge:

  • Regex
  • Dateisystem
  • Faden
  • lexical_cast
  • program_options (einfach genial!)
  • Test (für alle meine Unit-Test-Anforderungen).
  • String-Algorithmen
  • String-Tokenizer
  • Format (typsichere Formatierung von Zeichenfolgen im printf-Stil)
  • intelligente ptrs

Boost war eine große Hilfe, als ich meine erste plattformübergreifende App schrieb - ohne sie hätte ich wirklich Probleme gehabt.


4
Bitte aktualisieren Sie für C ++ 11 / C ++ 14 ...
einpoklum

28

Mir gefällt, wie Sie Ihren eigenen Destruktor für liefern können shared_ptr.
Dies bedeutet beispielsweise, dass Sie es verwenden können FILE*, um die Datei für Sie zu schließen.
z.B

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
Ich weiß, dass es fast zwei Jahre später ist, aber ... diese Zuordnung zu NULList nutzlos, da sie den lokalen Funktionsparameter zuweist. :)
Xeo

1
Danke @Xeo, ich habe es entfernt
hamishmcn

22

Niemand hat Multi-Index-Container erwähnt daher werde ich mich spät melden. Es kommt nicht so oft vor, dass Sie sie benötigen, aber ohne Boost ist es ein echtes Problem, eine gleichwertige Datenstruktur zu erstellen und weniger effizient zu sein. Ich habe sie in letzter Zeit häufig verwendet, um Container zu erstellen, die auf 2 Schlüsseln nachgeschlagen haben.


20

Ich bin überrascht, dass niemand erwähnt hat boost::optional. Ich benutze es öfter als irgendeinen Teil von Boost außer shared_ptrund scoped_ptr.


1
Jetzt verfügbar std::experimental::optionalund bald (C ++ 17?) Als std::optional.
Einpoklum

1
Ja, und ich freue mich sehr darüber. :-) Obwohl ich die Verzögerung zwischen den Standards und deren vollständige Implementierung in allen von mir verwendeten Compilern bedenke, wird es noch eine Weile dauern, bis ich mich darauf verlassen kann ... Ich konnte gerade erst mit C ++ 11 beginnen ein Projekt im letzten Jahr. :-(
Head Geek

Eigentlich denke ich, dass die meisten Compiler in den letzten Jahren die Standards erfüllen - GCC und Clang unterstützten C ++ 14, als es veröffentlicht wurde, nicht wahr? Wie auch immer, bitte überlegen Sie, Ihren Kommentar in Ihre Antwort zu integrieren.
Einpoklum

@HeadGeek Interessant zu sehen, dass nach 8 Jahren ein neuer Kommentar zu Ihrer Antwort hinzugefügt wurde und Sie geantwortet haben!
Deqing

Wow ... ich denke, es sind acht Jahre vergangen . Wie Kermit der Frosch sagt, macht die Zeit Spaß, wenn Sie Fliegen haben. ;-)
Head Geek

19

Niemand erwähnt boost :: tuple? Zum Schämen!


2
Jetzt erhältlich als std::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

Update (Oktober 2011): C ++ 11 (C ++ 0x) hat static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSG ermöglicht sehr einfach zu lesende / zu erkennende Fehler, die weitaus informativer sind als die Größe der unvollständigen Typnachricht, die BOOST_STATIC_ASSERT liefert.
KitsuneYMG

hier hier! Ich habe gerade einen dieser unvollständigen Typfehler im Testmakro BOOST_CHECK_CLOSE gefunden. Ich habe einen halben Tag gebraucht, um herauszufinden, was los war, bevor ich den Zweig aufgerufen habe, mit dem ich ihn aufgerufen habe (int, int, float). Sobald ich die ganzen Zahlen auf Gleitkomma umwandelte, verschwand der Fehler. Aber was das mit einem unvollständigen Typ zu tun hat, weiß ich wirklich nicht :)
Jamie Cook

9

Eine meiner am häufigsten verwendeten ist nicht Boost, sondern die Adobe Source Libraries (ASL), die auf Boost aufbauen - insbesondere die Erweiterungen der Standardalgorithmen, die einen Boost :: -Bereich anstelle separater Start- / End-Iteratoren akzeptieren. Dann, anstatt anzurufen, sagen wir:

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

Ich kann einfach sagen

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

(Ich hoffe, dass diese Teile von ASL irgendwann zu Boost migrieren.)


Ich mag es, ich werde die ASL
hamishmcn

8

Ich benutze viel:

  • Boost :: Signale
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bind
  • boost :: random
  • boost :: thread
  • boost :: nicht kopierbar

Andere wie Tuple, Static Assert und Integer sind sehr nützlich, wenn Sie eine Bibliothek schreiben, die auf einer Vielzahl von Plattformen verwendet werden soll.

Dinge wie Graphs und Lambda sind spezifischer.


Bitte aktualisieren Sie für diese Tage von C ++ 11/14 (oder ziehen Sie in Betracht, die Antwort zu entfernen).
Einpoklum

8

boost::shared_ptrist eine Voraussetzung für die moderne C ++ - Programmierung IMHO. Deshalb haben sie es mit TR1 zum Standard hinzugefügt. boost::program_options, boost::bindUnd boost::signalsind wirklich nett , wenn Sie wissen , was sie sind und wie sie zu benutzen. Die letzten beiden neigen jedoch dazu, Neuankömmlinge zu erschrecken.


7

Wir fanden boost :: spirit ziemlich nützlich für eine Geschäftslösung zum Parsen von ECMAScript. Komplex, aber sehr schön!



7

Ich benutze shared_ptr seit Jahren. Es ist einfach so nützlich, es gibt keinen Grund, warum ein Projekt ohne es sein sollte.

Darüber hinaus verwende ich Bind / Function / Lambda für generische Rückrufmechanismen - besonders nützlich beim Testen - sowie Format für meinen allgemeinen Sprintf-Ersatz.

Schließlich war es erst neulich, als ich Variant in Wut verwendete, um ein Problem zu lösen (ein Parser, der mit einem kleinen, festen Satz nicht verwandter Token-Typen antworten konnte). Die Lösung war sehr elegant und ich bin sehr zufrieden damit.


Jahre sind vergangen und die Zeiten haben sich geändert, also Zeit für ein Update. SharedPtr und Function sind jetzt Teil des Standards, und Bind und Lambda sind durch die tatsächliche Lambda-Funktionalität auf Sprachebene überholt.

Ich verwende immer noch Variant (das ebenfalls standardisiert wurde, aber ich bin noch nicht da). Das Format wird größtenteils durch fmtlib (das ebenfalls standardisiert wurde) ersetzt.

Der große Teil von Boost, den ich benutze, ist Boost.Asio. Welches ist im Begriff, standardisiert zu werden.


1
Ich stimme all dem zu - außer Lambda. Ich habe es eine Weile benutzt, aber es ist so gewunden, dass ich es für alle außer den einfachsten Ausdrücken aufgegeben habe. Ich warte gespannt auf C ++ 0x und seine Form von Lambda-Ausdrücken.
Head Geek

Ich bin damit einverstanden, dass Boost.Lambda voller Fallstricke ist - sobald ich in die Bereiche von Unlambda oder Protect eintrete, gebe ich auf und mache es auf die alte Art, aber es scheint wichtig, Rückrufe auf halbwegs anständige Weise zu verlängern . Allerdings warte auch ich auf die Implementierung von C ++ 0x.
Kaz Dragon

6

Verwenden von Tupeln zum Iterieren einer Karte wie folgt:

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

Mit Boost Assign kann ich eine Karte wie folgt initialisieren:

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

Und mit Bereichsadaptern und dem Pipe-Operator ("|") kann ich die Werte einer Karte rückwärts durchlaufen (als Beispiel):

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

1
Das ist wirklich cool. Ich habe die Dokumentation zur Boost-Zuweisung gelesen
hamishmcn

5

Sie sollten boost :: program_options überprüfen. Dies erleichtert das Parsen von Befehlszeilen erheblich.


5

Ich benutze Boost Pointer Container vor einem STL Container von shared_ptrs.



3

Ich liebe boost :: random und boost :: asio und boost :: filesystem, aber boost :: bind, boost :: Circular_buffer und boost :: thread sind sehr praktisch, intelligente Zeiger sind in Ordnung, aber ich bevorzuge RAII als Speicherverwaltung


6
Intelligente Zeiger sind RAII.
Eclipse

4
Genauer gesagt, Smart Pointer geben Ihnen RAII, wenn Sie keine andere Wahl haben, als Speicher dynamisch zuzuweisen.
Branan

3

Okay, hier ist eine neue, die ich gefunden habe:
Anstatt stricmp zu verwenden, kann ich die Gleichheitsfunktion von boost verwenden und das Prädikat is_iequal übergeben,
z. B.:
Anstelle von

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

ich kann nutzen

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

gegeben:

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

3

Hier sind meine zwei Cent:

  • boost :: scope_exit - Die RAII-Klasse muss nicht nur für eine Verwendung definiert werden
  • boost :: any
  • boost :: variante
  • Boost Pointer Container Library (ptr_vector)
  • Boost Pool Bibliothek
  • boost :: unordered_map / boost :: unordered_set

3

ich benutze boost::icl ziemlich viel für die Textnachbearbeitung. Das hat mir ziemlich viel Zeit gespart, da ich sonst die Textaufteilung selbst implementieren müsste ...

BOOST_FOREACH ist überall in meinem Code :)

boost::functionund boost::bindsind ein absolutes Muss. Obwohl sie jetzt std::functionund sindstd::bind . Diese helfen wirklich dabei, die Menge an unnötigem Code zu reduzieren und sind im Allgemeinen gut für meine Designs (oder meine Wahnvorstellungen).

Ich habe vor kurzem angefangen zu verwenden boost::interprocess::message_queue und dies ist auch ein großartiges Werkzeug.

Ich würde viel mehr verwenden, aber Qt hat native Methoden, um viele Dinge zu tun, die Boost tut. Wenn ich jemals reines C ++ programmieren müsste, würde ich wahrscheinlich ein boost::junkie:) werden


3

Was ich am häufigsten benutze, ist jetzt im TR1 verfügbar:

  • gemeinsame Zeiger
  • Array-Klasse

Jetzt benutze ich auch Poolklassen und einige andere spezifischere Dinge.

Sie verstehen jetzt, dass Boost für die meisten Programmierer nützlich sein soll. Deshalb ist es der Prüfstand für die zukünftige Standardbibliothek.


1

Wenn wir über boost :: lexical_cast sprechen, warum ist so etwas wie 'format' kein statisches Mitglied in der std :: string-Bibliothek?
Fast alle GUI-Bibliotheken haben so etwas wie CString :: Format ("% i") oder QString :: Number ("% i"), die eine initialisierte Zeichenfolge zurückgeben.


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

Wenn Sie bereit sind, auf Typensicherheit zu verzichten, können Sie Ihre eigenen mit vsnprintf (), Ellipsen (...), va_list / stdarg.h und einem lokalen (stapelbasierten) Puffer rollen.
Mr.Ree

2
std :: string hat bereits 71 Funktionen zu viele (nach Herb Sutters Anzahl, nicht nach meiner). Weitere Informationen finden Sie unter gotw.ca/gotw/084.htm : Ich denke, es enthält genügend Informationen, um zu erklären, (a) warum das Format nicht in std :: string vorliegen muss und (b) warum es besser ist, generische Algorithmen als Klassenmitglieder zu schreiben funktioniert sowieso.
Steve Jessop

4
Oder anders ausgedrückt: "C ++ ist wie ein fremdes Land: Dort machen sie es anders" ;-)
Steve Jessop

1
Das Format ist nicht Teil der Bibliothek, da eine der Herausforderungen, die Stroustrup beim Entwerfen von C ++ stellte, die Erstellung einer typsicheren formatierten E / A-Bibliothek war. Offensichtlich war das Ergebnis das, was Sie mit iostreams sehen. Anscheinend hatte damals niemand an Interpolation gedacht. Vielleicht möchte jemand einen Formatstream schreiben, damit sich Traditionalisten wie zu Hause fühlen?
Phil Miller

1

Ich denke, die Frage sollte umgekehrt werden. Welchen Teil Ihres Boosts möchten Sie nicht nutzen?

Nach meiner Erfahrung ist so ziemlich alles in jedem Problembereich interessant und nützlich.

Sie sollten sich in der Boost-Dokumentation umsehen, um die Bereiche zu finden, die Ihre Interessen abdecken.

Eine Ausnahme mag sein, boost::numeric::ublasdass es seinen Job macht, aber Eigen macht es bemerkenswert besser.


Ich bezweifle, dass die Octonion-Bibliothek von vielen benutzt wird.
Petter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.