womit bei boost am "geschicktesten" beginnen?



  • jo, solche ähnlichen fragen wurden sicher schonmal gestellt...
    also, ich hab boost schon seit fast 8 wochen auf der platte drauf, ich sag mir jeden tag, dass ich mal damit anfangen sollte, dann schau ich mir die header an und denk:"ach du scheisse ist das ding groß, womit soll ich nur beginnen?". Im folgenden sinkt mein drang boost einzusetzen erheblich, bis ich mich wieder aufraffe, und mir die header anschaue und...(hier wieder von vorne beginnen^^).

    also, womit sollte man am besten zuerst beginnen, möglichst ohne direkt von der funktionalität erschlagen zu werden?



  • Einfach für Sachen für die Du es brauchen kannst.
    Bei mir waren das zB filesystem und Regex, fange nicht an, boost in Sachen reinzupressen für die Du es gar nicht brauchst, das brächte wohl nicht viel. 🙂



  • Hi!

    Suche was für dein Problem geeignet ist und verwende es. Mit der Zeit wirst du sie dann besser kennen lernen und wissen was man wo vielleicht noch anders machen kann, als bisher.

    Code-Hacker



  • man lernt das meiste erst nach und nach kennen. Erstmal sehr praktische Dinge sind vorallem die SmartPointer, boost::noncopyable (auch wenn es simpel ist :)) und auch BOOST_STATIC_ASSERT wird man schnell benutzen können, der Rest ergibt sich eben je nach Softwareprojekt. Wenn man Threads, Signale (Funktionswrapper), Dateisystem-Funktionen etc. benötigt, greift man zu boost. Lies dir am besten mal ein paar Beschreibungen durch und probier ein bisschen rum. Am besten lernst du IMHO den Umgang durch Praxis Erfahrung.



  • Ach ja in
    Modernes C++ Design | ISBN: 3826613473
    werden auch viele Dinge beschrieben, die so zum Teil in Boost umgesetzt wurden, auch wenn einige Teile wie das praktische Singleton-Template fehlen. Die fehlenden Teile findet man in der Buch eigenen Loki Library oder schreibt man eben selber.



  • das buch besitz ich 🙂
    habs auch fast komplett durch 🙂
    aber wie gesagt, der nimmt da die loki lib^^

    ich werd mich wohl mal dem tokenizer widmen, der hört sich sehr interessant an 🙂



  • Wie gesagt, die Smart Pointer sind sehr praktisch. Boost::array etc.



  • boost array hab ich mir grad ebend angeschaut,schöne sache 🙂



  • Du kannst ja mal gucken, ob du einige (manchmal unangenehm zu bedienende) C++-Sprachmittel durch Boost-Äquivalente ersetzen kannst:
    - rohe Zeiger mit boost::scoped_ptr/shared_ptr
    - unions durch boost::variant
    - void* durch boost::any
    - eingebaute Arrays durch boost::array
    - Funktiosnzeiger durch boost::function
    - optionale Rückgabewerte durch boost::optional (wie auch immer du die vorher umgesetzt hast)
    Ich würde aber keinesfalls sagen, dass die boost-Varianten in jeder Situation überlegen sind. Kannst ja einfach gucken, was dir besser gefällt.



  • Also ich denke, man muß nicht alles aus boost kennen. Ich z.B. hab mir mal nur wegen der Thread-Klasse boost installiert. Und nach zwei bis drei Zeilen Code hatte ich zwei funktionieren Threads in einer Konsolenanwendung. Einfach nur genial einfach und genial nützlich! 😃 👍 Ich habe z.B. auch noch nie alles aus der STL benötigt, muß man auch nicht. Aber gut zu wissen, man könnte!



  • wie gesagt, dass meiste lernt man erst während der Praxis. Man liest sich einmal durch, was es in Boost gibt, damit man ein ungefähres Bild hat und wenn man etwas programmiert, kommt man früher oder später eh auf Boost Teile zurück.



  • ich verschaff mir grad einen groben überblick über boost, und da kam mir die frage auf, was eigentlichd er sinn des boost::weak_ptr ist? er ist doch eigentlich nur ein enorm abgespeckter shared_ptr und hat eigentlich keinerlei funktionalität.
    wieso dann nicht gleich den shared_ptr benutzen, den man zur erstellung des weak_ptr braucht?



  • Z.B. boost::rational für Bruchrechnen:

    #include <iostream>
    #include <conio.h> // getch()
    #include <boost/rational.hpp>
    using namespace std;
    using namespace boost;
    
    int main()
    {
      rational<int> a, b, c;
      cout << "Bruch 1:  "; cin >> a;
      cout << "Bruch 2:  "; cin >> b;
      c = a * b;
      cout << "Resultat: " << c << " = " << rational_cast<double>(c);
      getch();
    }
    

    Ausgabe:

    Bruch 1: 33/234
    Bruch 2: 44/444
    Resultat: 121/8658 = 0.0139755

    Zufallszahlen:

    #include <conio.h>
    #include <iostream>
    #include <boost/random/linear_congruential.hpp>
    #include <boost/random/uniform_real.hpp>
    #include <boost/random/variate_generator.hpp>
    using namespace std;
    
    int main()
    {
      int n; 
      double start, ende, zufallszahl, m = 0.0;
    
      cout << "Anzahl:    "; cin >> n;
      cout << "Startzahl: "; cin >> start;
      cout << "Endzahl:   "; cin >> ende; 
    
      boost::minstd_rand  generator(42u);
      generator.seed( unsigned (time(0)) );
      boost::uniform_real<> uni_dist(start,ende);
      boost::variate_generator<boost::minstd_rand&, boost::uniform_real<> > uni(generator, uni_dist);
    
      cout.setf(ios::fixed);
      cout << n << " samples of a uniform distribution in [" << start <<".."<< ende << "]:\n\n";
      for(int i = 0; i < n; ++i)
      {
        zufallszahl = uni();
        cout << zufallszahl << '\t';
        m += zufallszahl;
      }
      m /= n;
      cout << "\n\nMittelwert: " << m << endl;   
    
      getch();
    }
    

    Normalverteilung:

    #include <boost/random.hpp>
    #include <conio.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
     boost::mt19937 generator;
     boost::normal_distribution<> normal_dist(90,5);
     boost::variate_generator< boost::mt19937&, boost::normal_distribution<> > random(generator, normal_dist);
    
     cout << "Mittelwert:         " << normal_dist.mean()  << endl;
     cout << "Standardabweichung: " << normal_dist.sigma() << endl; 
     cout << "Varianz:            " << normal_dist.sigma()*normal_dist.sigma() << endl << endl; 
     for (int i=0;i<30;++i)
         cout << random() << endl;
    
       getch();
    }
    


  • noch ne letzte frage für heute, weil ichd azu in der doku nichts gefunden hab: besitzt boost ein grundgerüst für finite state machines? oder für den tokenizer eine einfache grammatik um einen string nach den gesichtspunkten zahl/bezeichner/mathematische zeichen aufzuteilen?



  • gibts eine datums / zeit klasse in boost ? ( ich find da nix )



  • ja, schau mal date_time an 🙂



  • otze schrieb:

    noch ne letzte frage für heute, weil ichd azu in der doku nichts gefunden hab: besitzt boost ein grundgerüst für finite state machines? oder für den tokenizer eine einfache grammatik um einen string nach den gesichtspunkten zahl/bezeichner/mathematische zeichen aufzuteilen?

    boost::tokenizer benutzt Delimiters, um einen string in Tokens aufzuteilen, siehe z.B. boost::char_separator. Oder vielleicht suchst du lexical_cast?



  • otze schrieb:

    was eigentlichd er sinn des boost::weak_ptr ist?

    Er erhält ein Objekt nicht am Leben. Das ist ein Feature. Manchmal will man ein Objekt nur beobachten. (Für Caches z.B. sehr praktisch.)



  • ne, das is nicht das was ich suche, ich will schon ne tokenizer funktion benutzen, nur halt was andres als boost::char_separator, etwas was wie eine finite state machine funktioniert, aber am besten zeige ichs an einem beispiel:

    15+cos(30+45)+20sin(10)
    wird zu
    <15> <+> <cos> <(> <30> <+> <45> <)> <+> <20> <
    > <sin> <(> <10> <)>

    wobei <> die einzelnen token abtrennen
    dazu brauch ich halt ne kleine grammatik, und die wird am besten mit einer finite state machine implementiert.

    @operator void thx, sowas hab ich mir schon gedacht, aber noch keine sinnvolle anwendungsmöglichkeit dazu entdeckt, oder ist das sowas wie:
    wenn du den pointer locken kannst, dann mach was damit sonst lösche ihn aus der liste, da das objekt zerstört ist



  • Ich habe es zwar noch nie benutzt, aber vielleicht spirit? tokenizer ist dafür definitiv ungeeignet.
    http://www.boost.org/libs/spirit/


Log in to reply