unordered_map

unordered_map

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Ne znam kako da pocnem da objasnim ono sto mi treba, valjda ce te razumeti.

Pratim jedan NGD (Newton Game Dynamics) physics tutorijal vezan za materijale i njihovu interakciju.

http://newtondynamics.com/wiki/index.php5?title=Tu.....ial_System

Ako pogledate klasu MaterialManager, ocigledno autor tog tutorijala je veliki ljubitelj C jezika, a i da se videti da je bez potrebe preterao sa "obfuskacijom" koda (verovatno da prikaze sebi da je "kul" a nije jedini koji tako radi, a usto me mnogo nerviraju tako sa tim stilom Evil or Very Mad ), u vezi generisanja hash-eva za parove materijala.
Pa sam resio da to sebi uprostim sa klasama iz C++ standardne biblioteke koje vec imaju te funkcionalnosti a "skrivaju" nepotrebne detalje:

#include <iostream> #include <unordered_map> // tipovi materijala enum E_MAT_TYPE {    EMT_WOOD     = 0,    EMT_CONCRETE = 1,    EMT_WATER    = 2,    EMT_DIRT     = 3,    EMT_METAL    = 4 }; // par materijala // npr. { EMT_WOOD, EMT_DIRT } je isto sto i { EMT_DIRT, EMT_WOOD } struct MatPair {    int id0;    int id1;    MatPair(int _id0, int _id1)       : id0(_id0), id1(_id1)    {}    bool operator == (const MatPair& o) const    {       if((id0 == o.id0 && id1 == o.id1) || (id0 == o.id1 && id1 == o.id0))          return true;       return false;    } }; // fizicke interakcije izmedju parova struct MatInteraction {    //float restitution;    //float staticFriction;    //float kineticFriction;    float value; // samo za test }; // iz WIKI artikla namespace std {    template <>    class hash<MatPair>    {    public :       size_t operator () (const MatPair& m ) const       {          return hash<int>()(m.id0) ^ hash<int>()(m.id1);       }    }; } class MatInterManager { private:    std::unordered_map<MatPair, MatInteraction> mMat;         // ako nema u mMap onda koristimo default    MatInteraction                              defInteraction; public:    MatInterManager()    {       defInteraction.value = 0.0f;    }    // ova metoda se poziva samo u procesu "ucitavanja"    void addInteraction(int id0, int id1, const MatInteraction& mInt)    {       mMat[MatPair(id0, id1)] = mInt;    }    // ova metoda se poziva vise puta u jednom frejmu    // pa je neophodno da bude brza    MatInteraction getInteraction(int id0, int id1)    {       auto it = mMat.find(MatPair(id0, id1));       if(it != mMat.end())          return (*it).second;       return defInteraction;    } }; // test int main() {    MatInteraction intWoodConcrete = { 1.0f };    MatInteraction intWoodWater    = { 2.0f };    MatInteraction intWoodDirt     = { 3.0f };    MatInteraction intWoodMetal    = { 4.0f };    MatInterManager mgr;    mgr.addInteraction(EMT_WOOD, EMT_CONCRETE, intWoodConcrete);    mgr.addInteraction(EMT_WOOD, EMT_WATER,    intWoodWater);    mgr.addInteraction(EMT_WOOD, EMT_DIRT,     intWoodDirt);    mgr.addInteraction(EMT_WOOD, EMT_METAL,    intWoodMetal);    auto inter0 = mgr.getInteraction(EMT_DIRT, EMT_WOOD); // treba da vrati "intWoodDirt"    std::cout << "DIRT + WOOD = " << inter0.value << std::endl;    auto inter1 = mgr.getInteraction(EMT_DIRT, EMT_DIRT); // treba da vrati default    std::cout << "DIRT + DIRT = " << inter1.value << std::endl;    return 0; }

Nije mi jasno generisanje hash-eva (isecak sto sam uzeo iz WIKI artikla), odnosno da li mi je ovako garantovana unikatnost parova elemenata?
Imate mozda bolju ideju?

Ako treba jos detalja, recite pa da dodam.
Hvala na izdvojenom vremenu.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
Ko je trenutno na forumu
 

Ukupno su 1009 korisnika na forumu :: 36 registrovanih, 2 sakrivenih i 971 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., airsuba, babaroga, Ben Roj, bojank, Botovac, Bubili, Darkhunter, Dimitrije Paunovic, DonRumataEstorski, draganl, Georgius, HogarStrashni, ILGromovnik, Ivica1102, ivica976, kikisp, kovinacc, Kubovac, kybonacci, Magistar78, milenko crazy north, Milos ZA, nemkea71, nenooo, Outis, Panonsky, panzerwaffe, pein, Shilok, sickmouse, slonic_tonic, Smd, sovanova95, vaso1, Vlad000