Bags in C++



  • ccc schrieb:

    das heißt bug

    Das les ich eben auch immer, wenn ich die Thread Liste überfliege.. :p


  • Mod

    hustbaer schrieb:

    Mit Standard C++ kannst du void* nicht ordnen, da Zeigervergleich undefiniert ist, wenn die Zeiger nicht aus dem selben Array kommen.

    Nach der Logik könnten Zeiger niemals als Keys eines assoziativen Containers auftreten. Diese Einschränkung gilt erfahrungsgemäß nicht.
    Denn std::less ist sehr wohl definiert für beliebige gültige Zeigerpaare (20.3.3/8).



  • camper schrieb:

    hustbaer schrieb:

    Mit Standard C++ kannst du void* nicht ordnen, da Zeigervergleich undefiniert ist, wenn die Zeiger nicht aus dem selben Array kommen.

    Nach der Logik könnten Zeiger niemals als Keys eines assoziativen Containers auftreten. Diese Einschränkung gilt erfahrungsgemäß nicht.
    Denn std::less ist sehr wohl definiert für beliebige gültige Zeigerpaare (20.3.3/8).

    Cool, wusste ich nicht.

    Bringt aber eigentlich nix in dem Fall. boost::any ist ein "value type", d.h. die Adresse des "inneren T" würde sich mit Zuweisung/Kopie ändern. D.h. weiter, ein set.find(v) würde nie was finden. Kann man also gleich std::list nehmen.

    p.S.: oder vielleicht ein std::set<boost::shared_ptr<boost::any> > 😃



  • Das mit es mit find() nicht funktioniert musste ich leider feststellen.

    Mein Workaround hierzu ist eine häßliche schleife:

    bool Beutel::includes(SFR sfrgeld){
    
         for(int x=0;x<geldbeutel.size();x++)
        {
    
        if ((geldbeutel[x].type() == typeid(SFR))&&((sfrgeld.getValue() == (boost::any_cast<SFR>(geldbeutel[x]).getValue()))))
            {
            return true;
            }
    
         };
    return false;
     };
    

    Gibts da echt keine andere Möglichkeit?



  • Dem STL-Algorithmus std::find_if() kannst du eine Vergleichsfunktion übergeben. Aber der Code wird dadurch gesamthaft nicht kürzer, nur deine includes() -Funktion sieht schöner aus.


Anmelden zum Antworten