Arbeiten mit der STL



  • Hallo,

    ich versuche im Moment besser mit der STL umzugehen in diesem Fall mit dem vector

    Ich habe ein Struct und einen Vector

    struct Power {
    	unsigned time;
    	unsigned int amount;
    }
    
    std::vector<Power> vPower;
    

    Wie kann ich jetzt im "C++ mit STL"-Stil herausfinden welche vectoreinträge zwischen zwei Zeiten timeStart und timeEnd liegen?


  • Mod



  • Ergänzend: Wenn du die Einträge sortiert einfügst, kannst Du den Aufwand noch etwas reduzieren, indem Du erst über binäre Suche den ersten Eintrag mit time > timeStart findest und dann einfach weiteriterierst. Bei recht wenigen Einträgen ist das aber vernachlässigbar.



  • std::for_each
    (
            begin, end,
            [] (Power const& p)
            {
                    if(foo)
                            bar;
            }
    );
    


  • EinUnreg schrieb:

    Ich habe ein Struct und einen Vector

    struct Power
    {
    	unsigned time;
    	unsigned int amount;
    };
    
    std::vector<Power> vPower;
    

    Wie kann ich jetzt im "C++ mit STL"-Stil herausfinden welche vectoreinträge zwischen zwei Zeiten timeStart und timeEnd liegen?

    Und dann? Was soll denn das Ergebnis sein? Ein neuer Vektor mit Indizes?



  • krümelkacker schrieb:

    EinUnreg schrieb:

    Ich habe ein Struct und einen Vector

    struct Power
    {
    	unsigned time;
    	unsigned int amount;
    };
    
    std::vector<Power> vPower;
    

    Wie kann ich jetzt im "C++ mit STL"-Stil herausfinden welche vectoreinträge zwischen zwei Zeiten timeStart und timeEnd liegen?

    Und dann? Was soll denn das Ergebnis sein? Ein neuer Vektor mit Indizes?

    Schaetze mal genau diese "Power" Objekte die zwischen den Zeitspannen liegen.



  • Glaube er will das hier haben:

    std::vector<Power> vPower;
    std::vector<Power> results;
    
    std::copy_if
    (
            std::begin(vPower)
            , std::end(vPower)
            , std::back_inserter_iterator<std::vector<Power>>(results),
            [] (Power const& p)
            {
                    if(foo)
                            bar;
            }
    );
    

    EDIT: Auf copy_if umgestellt, geht aber nur mit dem neuen Standard. Aber du kannst dir auch fix dein eigenen copy_if Algo schreiben.



  • Danke für die Beiträge. Ja, ich wollte die Einträge in einem neuem Vector haben. Ich finde die STL ist gewöhnungsbedürftig, vieleicht liegt's auch nur daran, dass alles so neu ist.



  • Nimm std::back_inserter, so sparst du dir das Template-Argument.


  • Mod

    EinUnreg schrieb:

    Danke für die Beiträge. Ja, ich wollte die Einträge in einem neuem Vector haben.

    Dann copy_if (ist zwar genau genommen C++11, können aber viele ältere Compiler auch. Außerdem sollte man C++11 so langsam voraussetzen dürfen). Lies dir am besten mal eine Übersicht über die ganzen Algorithms durch, es gibt so viele:
    http://en.cppreference.com/w/cpp/algorithm



  • Gibt es eigentlich Pläne in einem zukünftigen C++-Standard auch eine Art LINQ wie in C# einzubauen?

    var results = from vPower p
                  where p.time >= timeStart
                  and p.time <= timeEnd
                  select p;
    

    Finde ich persönlich wesentlich schöner.

    MfG SideWinder



  • SideWinder schrieb:

    Gibt es eigentlich Pläne in einem zukünftigen C++-Standard auch eine Art LINQ wie in C# einzubauen?

    var results = from vPower p
                  where p.time >= timeStart
                  and p.time <= timeEnd
                  select p;
    

    Finde ich persönlich wesentlich schöner.

    MfG SideWinder

    Ich bin mir nicht sicher ob es in all zu kurzer Zeit einen neuen Standard geben wird 😃 Mal davon abgesehen das es schoener ist 😉



  • Mit C++2X könnte das so aussehen:

    auto results = std::make_filter_range(
      [](Power const& p){ return p.time >= timeStart && p.time <= timeEnd; },
      vPower);
    

    Stroustrup wollte ja so etwas wie Ranges unterstützen. Ein Sprachfeature wie LINQ würde nur die Sprache überladen.


Anmelden zum Antworten