C++ asszociatív tárolóba hogyan kerülnek be objektumok?
A map tulajdonképpen a tömb adatszerkezet általánosítása, klasszikus tömbnek csak egész számok lehetnek kulcsai, mert nagyon hatékony(persze tudok ellenpéldát mondani ...)
A map az egy (asszociatív) tömb. pl. tomb["alma"]=7. Ahogy a tömb-nél megszokott úgy másolat keletkezik, ha azt szeretnéd hogy az objektumok referencia szerint kerüljenek be akkor úgy kell deklarálni a map-ot hogy adatként ne objektumot hanem objektum referenciát (pointert) tároljon pl.: map<string,myclass*> p
Azt hogy érted hogy kulcsokból is egy-egy példány létezzen? Ezek kulcs:érték párok, egy kulcshoz egy érték tartozhat.
Ha azt írom hogy tomb["alma"]=7; "alma"-hoz a 7 érték van hozzárendelve. Ha utána ez van: tomb["alma"]=10; "alma"-hoz a 10 érték van hozzárendelve, függetlenül hogy előtte mi volt, úgy mint a klasszikus tömböknél ezt megszoktuk.
Azt vágom mi a map, a kérdésem csak annyi volt hogy ha az érték objektum, akkor beszúráskor egy másodpéldánya kerül-e az értékek közé. (ezek szerint igen)
Az egy-egy példányt azért kérdeztem, mert egy fordított map-et (map<myClass*, strinig>) is létre akarok hozni, ami az objektumokhoz rendeli hozzá az azonosítójukat, de az azonosítókat se akarom hogy két példányban létezzenek. (Ezek szerint akkor azokat is pointerként kell definiálnom)
"Azt vágom mi a map, a kérdésem..." Oké, de erről nem voltam meggyőződve.
"Az egy-egy példányt azért kérdeztem, mert egy fordított map-et (map<myClass*, strinig>) is létre akarok hozni, ami az objektumokhoz rendeli hozzá az azonosítójukat, de az azonosítókat se akarom hogy két példányban létezzenek. (Ezek szerint akkor azokat is pointerként kell definiálnom)"
Igen. Amúgy nem is működne, ha nem pointer-ként definiálod, csak ha definiálsz az objektumokra egy rendezési relációt, így viszont nem kell mert a pointer-ekre van már definiálva.
Ha oda-vissza akarsz keresni, akkor lehet egyszerűbb lenne valami kétszeresen rendezett listát használnod, illetve mégegyszer átgondolni a feladatot. A pointerekkel bűvészkedés szinte mindig kerülendő.
Amúgy miért baj, ha másolat készül a stringekről?
"Származtatnod kell egy olyan asszociatív tömb osztályt, amiben az értékek sem ütközhetnek"
Nem megoldás mert azt akarom hogy a keresés oda-vissza ugyanolyan hatékony legyen. Kifejezetten azért használok map-ot mert a kulcsokat bináris keresőfában helyezi el, az értékekre viszont külön nekem kellene megvalósítani. (ami nyilván nem annyira nehéz, de 2 map használata még mindíg egyszerűbb)
A stringeket pusztán helytakarékosság miatt nem akarom duplikálni. A pointerekkel bűvészkedés sem akkora probléma. (Sőt számomra kissé egyértelműbb mint a referenciák használata.)
Még annyi lenne a kérdésem hogy ha a map pointereket és nem objektumokat tartalmaz akkor a clear metódus ugyanúgy meghívja a destruktorokat, vagy csak a pointereket törli?
A dokumentáció szerint meghívja a destruktoraikat.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!