Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 29. srpen 2010, 10:27:21 Předmět: vector<Object> vs. vector <Object *> |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 29. srpen 2010, 11:05:20 Předmět: |
|
|
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 |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 29. srpen 2010, 11:09:55 Předmět: |
|
|
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 |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 29. srpen 2010, 12:55:27 Předmět: |
|
|
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 |
|
 |
|
|
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