Parties les plus utilisées de Boost [fermé]


116

Quand j'ai découvert, boost::lexical_castje me suis dit "pourquoi n'ai-je pas su cela plus tôt!" - Je détestais avoir à écrire du code comme

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

Maintenant j'écris

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

Hier, sur stackoverflow, je suis tombé sur boost split (un autre joyau qui me permettra d'économiser du code).

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

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

Je vais commencer à chercher dans la documentation de boost à la recherche d'autres fonctions que je pourrai utiliser régulièrement, mais je pense qu'il sera très facile de rater des choses.

Quelles fonctions de boost utilisez-vous le plus / détesteriez-vous ne pas avoir?


1
Par intérêt, qu'est-ce qui vous a empêché d'écrire votre propre fonction "convertir un nombre en chaîne" avant d'utiliser Boost? J'aurais vu la duplication et écrit un modèle simple et utilisé cela, puis, peut-être, je suis passé à la version boost quand je l'ai trouvé ...
Len Holgate

4
Salut Len, À différents moments sur différents projets, j'ai écrit une fonction "ToStr" basée sur un modèle, mais ensuite je passais à un autre projet, puis finissais par écrire le 3-liner parce que je voulais juste faire le sacré truc: - ) par opposition à la surcharge de la création d'un fichier "misc_funcs"
hamishmcn

Réponses:


62

La partie de boost la plus utilisée pour moi est probablement boost :: shared_ptr .


13
Aussi probablement le plus utilisé. J'ai moi-même appris la leçon à la dure en ayant à refactoriser la plupart des utilisations de shared_ptr par des références, des conteneurs de pointeurs et auto_ptr. Je suis maintenant plutôt d'accord avec ceci: bureau14.fr/blogea/index.php/2009/08/…
amit le

1
@phaedrus: Lien mis à jour: blogea.bureau14.fr/index.php/2009/08/…
MatthewD

4
N'est plus pertinent dans C ++ 11 qui a std::shared_ptret std::unique_ptr.
einpoklum


35

Mes favoris sont, sans ordre particulier:

  • regex
  • système de fichiers
  • fil
  • lexical_cast
  • program_options (tout simplement génial!)
  • test (pour tous mes besoins en tests unitaires).
  • Algorithmes de chaîne
  • Tokenizer de chaîne
  • format (formatage de chaîne de style printf sécurisé)
  • ptrs intelligents

Boost a été d'une grande aide lorsque j'ai écrit ma première application multiplateforme - sans cela, j'aurais vraiment eu du mal.


4
Veuillez mettre à jour pour C ++ 11 / C ++ 14 ...
einpoklum

28

J'aime la façon dont vous pouvez fournir votre propre destructeur shared_ptr.
Cela signifie, par exemple, que vous pouvez l'utiliser avec FILE*et l'obtenir pour fermer le fichier pour vous.
par exemple

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
Je sais que c'est presque deux ans plus tard, mais ... cette affectation à NULLest inutile, car elle assigne le paramètre de fonction locale. :)
Xeo

1
Merci @Xeo, je l'ai supprimé
hamishmcn

22

Personne n'a mentionné les conteneurs multi-index , je vais donc sonner tard. Ce n'est pas si souvent que vous en avez besoin, mais sans boost, c'est vraiment pénible de créer une structure de données équivalente, tout en étant moins efficace. Je les ai beaucoup utilisés récemment pour créer des conteneurs qui recherchent 2 clés.


20

Je suis surpris que personne ne l'ait mentionné boost::optional. Je me retrouve à l'utiliser plus souvent que n'importe quelle partie de Boost sauf shared_ptret scoped_ptr.


1
Désormais disponible dès std::experimental::optionalet bientôt (C ++ 17?) En tant que std::optional.
einpoklum

1
Ouais, et j'en suis très content. :-) Bien que compte tenu du délai entre les standards et leur implémentation complète dans tous les compilateurs que j'utilise, il faudra encore un certain temps avant que je puisse en dépendre ... J'ai juste pu commencer à utiliser C ++ 11 sur un projet l'année dernière. :-(
Head Geek

En fait, je pense que la plupart des compilateurs sont d'accord pour répondre aux normes de ces dernières années - GCC et Clang supportaient C ++ 14 lors de sa sortie, n'est-ce pas? Quoi qu'il en soit, pensez à intégrer votre commentaire dans votre réponse.
einpoklum

@HeadGeek Intéressant de voir un nouveau commentaire ajouté à votre réponse après 8 ans, et vous avez répondu!
Deqing le

Wow ... Je suppose que ce a été huit ans. Comme le dit Kermit la grenouille, le temps est amusant lorsque vous avez des mouches. ;-)
Head Geek

19

Personne ne mentionne boost :: tuple? Pour la honte!


2
Maintenant disponible en std::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

Mise à jour (octobre 2011): C ++ 11 (C ++ 0x) a static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSG permet de lire / repérer des erreurs très faciles qui sont beaucoup plus informatives que la taille d'un message de type incomplet donné par BOOST_STATIC_ASSERT.
KitsuneYMG

ici ici! Je viens de trouver une de ces erreurs de type incomplètes dans la macro de test BOOST_CHECK_CLOSE - il m'a fallu une demi-journée pour comprendre ce qui se passait avant de dire que je l'avais appelée avec (int, int, float); une fois que j'ai converti les nombres entiers en virgule flottante, l'erreur a disparu. Mais ce que cela a à voir avec un type incomplet, je ne sais vraiment pas :)
Jamie Cook

9

L'un de mes plus utilisés n'est pas Boost proprement dit, mais les bibliothèques Adobe Source (ASL) construites au-dessus de Boost - en particulier, les extensions des algorithmes standard qui acceptent un boost :: range à la place d'itérateurs de début / fin séparés. Alors au lieu d'appeler, disons

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

Je peux simplement dire

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

(J'espère que ces parties d'ASL migreront éventuellement vers Boost.)


J'aime ça, je vais vérifier l'ASL
hamishmcn

8

J'utilise beaucoup:

  • boost :: signaux
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bind
  • boost :: aléatoire
  • boost :: thread
  • boost :: non copiable

D'autres comme Tuple, Static Assert et Integer sont très utiles si vous écrivez une bibliothèque qui doit être utilisée sur une variété de plates-formes.

Des choses comme les graphiques et Lambda sont plus spécifiques.


Veuillez mettre à jour pour ces jours de C ++ 11/14 (ou envisager de supprimer la réponse).
einpoklum

8

boost::shared_ptrest une exigence pour la programmation C ++ moderne IMHO. C'est pourquoi ils l'ont ajouté à la norme avec TR1. boost::program_options, boost::bindet boost::signalsont vraiment sympas si vous savez à quoi ils servent et comment les utiliser. Les deux derniers ont tendance à effrayer les nouveaux arrivants.


7

Nous avons trouvé boost :: spirit assez utile pour une solution commerciale pour analyser ECMAScript. Complexe, mais très agréable!



7

J'utilise shared_ptr depuis des années maintenant. C'est tellement utile qu'il n'y a aucune raison pour qu'un projet s'en prive.

En plus de cela, j'utilise également Bind / Function / Lambda pour les mécanismes de rappel génériques - particulièrement utiles lors des tests - ainsi que Format pour mon remplacement de sprintf à usage général.

Enfin, c'était juste l'autre jour que j'ai utilisé Variant dans la colère pour résoudre un problème (un analyseur qui pouvait répondre avec un petit ensemble fixe de types de jetons non liés). La solution était très élégante et j'en suis très content.


Les années ont passé et les temps ont changé, il est donc temps de faire une mise à jour. SharedPtr et Function font désormais partie de la norme, et Bind et Lambda sont obsolètes par la fonctionnalité lambda au niveau du langage.

J'utilise toujours Variant (qui a également été standardisé, mais je n'y suis pas encore), Format est largement remplacé par fmtlib (qui a également été standardisé).

La grande partie de Boost que j'utilise est Boost.Asio. Qui est en cours de normalisation.


1
Je suis d'accord avec tout ce qui précède - sauf Lambda. Je l'ai utilisé pendant un certain temps, mais il est tellement tortueux que je l'ai abandonné pour tout sauf les expressions les plus simples. Attend avec impatience C ++ 0x et sa forme d'expressions lambda.
Head Geek

Je suis d'accord que Boost.Lambda est plein de toutes sortes d'embûches - dès que j'entre dans les royaumes d'Unlambda ou de Protect, j'abandonne et le fais à l'ancienne, mais cela semble essentiel pour étendre les rappels de manière à moitié décente . Cela dit, j'attends moi aussi l'implémentation de C ++ 0x.
Kaz Dragon

6

Utilisation de tuples pour itérer une carte, comme ceci:

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

En utilisant boost assign, je peux initialiser une carte comme celle-ci:

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

Et en utilisant des adaptateurs de plage et l'opérateur pipe ("|"), je peux parcourir les valeurs d'une carte (à titre d'exemple):

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

1
C'est vraiment cool. Cela m'a permis de lire la documentation pour l'attribution de boost: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn

5

Vous devriez vérifier boost :: program_options. Cela rend l'analyse de la ligne de commande beaucoup plus facile.


5

J'utilise Boost Pointer Containers de préférence à un conteneur STL de shared_ptrs.



3

J'adore boost :: random et boost :: asio et boost :: filesystem, mais boost :: bind, boost :: circular_buffer et boost :: thread sont très pratiques, les pointeurs intelligents sont ok mais je préfère RAII à la place comme gestion de la mémoire


6
Les pointeurs intelligents sont RAII.
Eclipse

4
plus précisément, les pointeurs intelligents vous donnent RAII lorsqu'il n'y a pas d'autre choix que d'allouer de la mémoire de manière dynamique.
Branan

3

D'accord, voici un nouveau que j'ai trouvé: au
lieu d'utiliser stricmp, je peux utiliser la fonction equals de boost et passer le prédicat is_iequal,
par exemple:
au lieu de

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

je peux utiliser

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

donné:

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

3

Voici mes deux cents:

  • boost :: scope_exit - pas besoin de définir la classe RAII juste pour une seule utilisation
  • boost :: any
  • boost :: variante
  • Bibliothèque de conteneurs Boost Pointer (ptr_vector)
  • Boost Pool Library
  • boost :: unordered_map / boost :: unordered_set

3

J'utilise boost::iclbeaucoup pour le post-traitement de texte. Cela m'a fait gagner beaucoup de temps car sinon, je devrais implémenter moi-même la division de texte ...

BOOST_FOREACH est partout dans mon code :)

boost::functionet boost::bindsont un must absolu. Bien que maintenant ils soient std::functionetstd::bind . Celles-ci aident vraiment à réduire la quantité de code inutile et sont généralement bonnes pour mes créations (ou mes illusions).

J'ai récemment commencé à utiliser boost::interprocess::message_queue et c'est aussi un excellent outil.

J'en utiliserais beaucoup plus, mais Qt a des moyens natifs de faire beaucoup de choses que Boost fait. Si jamais je dois programmer du C ++ pur, je suppose que je deviendrais boost::junkie:)


3

Ce que j'utilise le plus est maintenant disponible dans le TR1:

  • pointeurs partagés
  • classe de tableau

Maintenant, j'utilise également des classes de piscine et d'autres choses plus spécifiques.

Vous comprenez maintenant que Boost est censé être utile à la plupart des programmeurs, c'est pourquoi c'est le banc d'essai de la future bibliothèque standard.


1

En parlant de boost :: lexical_cast, pourquoi quelque chose comme 'format' n'est-il pas un membre statique dans la bibliothèque std :: string?
Presque toutes les bibliothèques d'interface graphique ont quelque chose comme CString :: Format ("% i") ou QString :: Number ("% i") qui retournent une chaîne initialisée.


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

Si vous êtes prêt à renoncer à la sécurité de type, vous pouvez lancer le vôtre avec vsnprintf (), ellipsis (...), va_list / stdarg.h et un tampon local (basé sur la pile).
Mr.Ree

2
std :: string a déjà 71 fonctions de trop (selon le compte de Herb Sutter, pas le mien). Voir gotw.ca/gotw/084.htm pour plus de détails: je pense qu'il contient suffisamment d'informations pour expliquer (a) pourquoi le format n'a pas besoin d'être dans std :: string, et (b) pourquoi il est préférable d'écrire des algorithmes génériques plutôt que des membres de classe fonctionne de toute façon.
Steve Jessop

4
Ou pour le dire autrement, "C ++ est comme un pays étranger: on y fait les choses différemment" ;-)
Steve Jessop

1
Le format ne fait pas partie de la bibliothèque car l'un des défis posés par Stroustrup lors de la conception du C ++ était la construction d'une bibliothèque d'E / S formatée de type sécurisé. Évidemment, le résultat était ce que vous voyez avec iostreams. Apparemment, personne n'avait pensé à l'interpolation à l'époque. Peut-être que quelqu'un aimerait écrire un formatstream, pour que les traditionalistes se sentent plus chez eux?
Phil Miller

1

Je pense que la question devrait être inversée. Quelle partie de votre boost ne voudriez-vous pas utiliser?

D'après mon expérience, presque tout cela est intéressant et utile dans chaque domaine problématique.

Vous devriez passer du temps à parcourir la documentation du boost pour trouver les domaines qui couvrent vos intérêts.

Une exception peut être celle boost::numeric::ublasqui fait son travail, mais Eigen le fait remarquablement mieux.


Je doute que la bibliothèque octonion soit utilisée par beaucoup.
Petter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.