Kezdőoldal » Számítástechnika » Programozás » C++ asszociatív tárolóba...

C++ asszociatív tárolóba hogyan kerülnek be objektumok?

Figyelt kérdés
Asszociatív konténerben szeretnék objektumokat tárolni, string kulcsokkal, úgy hogy lehetőleg az objektumokból és a kulcsokból is csak egy-egy példány létezzen. A map-be objektumok referencia szerint kerülnek be, vagy a beszúráskor másolat készül róluk?

2012. febr. 22. 17:11
 1/9 anonim ***** válasza:
68%

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.

2012. febr. 22. 18:43
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:

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)

2012. febr. 22. 19:37
 3/9 anonim ***** válasza:

"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.

2012. febr. 22. 21:32
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
Származtatnod kell egy olyan asszociatív tömb osztályt, amiben az értékek sem ütközhetnek. Ennek lehet megfordítás metódusa.
2012. febr. 23. 10:38
Hasznos számodra ez a válasz?
 5/9 iostream ***** válasza:

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?

2012. febr. 23. 11:42
Hasznos számodra ez a válasz?
 6/9 A kérdező kommentje:

"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?

2012. febr. 23. 16:35
 7/9 iostream ***** válasza:
Ugye miért is hívná meg a destruktorokat. Nem az ő dolga eldönteni, hogy mikor kell megsemmisíteni. Viszont ha ilyen problémád van, használd a shared_pointer-t, sőt méginkább a make_shared() függvényt.
2012. febr. 23. 17:29
Hasznos számodra ez a válasz?
 8/9 A kérdező kommentje:

A dokumentáció szerint meghívja a destruktoraikat.

[link]

2012. febr. 23. 20:36
 9/9 iostream ***** válasza:
Ha VAN destruktora az objektumnak akkor meghívja. Egy pointernek nincs destruktora, csak az általa mutatott ojjektumnak lehet.
2012. febr. 23. 20:56
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!