.[ ČeskéHry.cz ].
vector<Object> vs. vector <Object *>

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 29. srpen 2010, 10:27:21    Předmět: vector<Object> vs. vector <Object *> Odpovědět s citátem

Dělá mi problém, kdy použít jen vektor objektů a kdy použít vektor ukazatelů na objekty, které pak vytvořím pomocí new?

Pokud mám vector pointerů na objekty, tak před .clear/.erase musím zavolat na daný objekt delete, ale je tam ještě nějaký rozdíl?
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 29. srpen 2010, 11:05:20    Předmět: Odpovědět s citátem

no vector je template teda v nom sa potom vola vnutri si toto

data = new T;
kde T je to co das medzi < >. teda ked tam das Object tak sa alokuje priamo objekt new Object a ked Object* tak smozrejme data = new Object*; teda sa alokuje miesto iba na ten pointer.

pri erase(), clear() sa potom vola delete na data. teda ak mas Object* tk sa uvolni iba miesto na pointery. samotne objekty ktore alokujes ty cez new uz nie.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
igor



Založen: 28. 07. 2007
Příspěvky: 196

PříspěvekZaslal: 29. srpen 2010, 11:09:55    Předmět: Odpovědět s citátem

Vector typicky ukládá vnitřně položky do normálního pole - při překročení jeho velikosti alokuje paměť pro pole větší, původní hodnoty zkopíruje a staré pole uvolní. U ukazatelů se kopírují pouze adresy objektů, u objektů celé objekty. U ukazatelové verze můžeš použít i nulové adresy, což se může hodit.
Na druhou stranu objektová verze drží data pěkně pohromadě, což může být velká výhoda (např. omezení "skákání" po paměti).
Pokud se chceš vyhnout ručnímu deletování, můžeš používat pole nějakých chytrých ukazatelů.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 29. srpen 2010, 12:55:27    Předmět: Odpovědět s citátem

Další praktická nevýhoda používání pointerů ve vektoru je trochu komplikovanější syntaxe při přístupu iterátory. Místo i->xxx je nutné psát něco jako (*i)->xxx a při použití algoritmů a mít na vědomí že iterátor se chová jako pointer-na-pointer na použitý objekt

Výhodou ale je, že pro danou třídu nemusím psát kopírovací konstruktor (a kopírovací operátor, a případně destruktor), a dají se takhle ukládat i objekty, pro které kopírování udělat vůbec nejde.
_________________
WWW | GitHub | TW
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna