Vymazavani polozek z listu pri jejich prochazeni – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vymazavani polozek z listu pri jejich prochazeni – C / C++ – Fórum – Programujte.comVymazavani polozek z listu pri jejich prochazeni – C / C++ – Fórum – Programujte.com

 

17. 2. 2008   #1
-
0
-

Potrebuju vymazat a deletovat polozky (pointery na objekty) z listu pri prochazeni toho vseho.

Tady mam definici toho listu:

std::list<entity*> entities;
Tady pak je ten vlastni loop:
	for(std::list<entity*>::iterator i=entities.begin();i!=entities.end();){


// tady je spousta ruznych prikazu tykajicich se (*i) a hlavne pak dalsi vnoreny loop, kde se tesuji kolize se vsemi dalsimi objekty (v zasade se jedna o temer stejnou smycky jako je ta prvni, akorat se tam pouziva iterator ii)

if((*i)->life<=0){
delete (*i);
i=entities.erase(i); // tady dojde k chybe, docela i chapu proc. jen si rikam, ze by to treba mohlo smazat jen ten obsah a ne ten vlastni iterator :)
continue;
}

// tady pak pokracuji jeste nejake dalsi akce s (*i)

i++;
}
Taky jsem pak zkousel jeste jednu variantu:
		if((*i)->life<=0){

entity* eTemp=(*i);
i=entities.erase(i);
delete eTemp;
continue;
}

Nevite jak udelat to o co se snazim? Nasel jsem spustu odpovedi na to, jak to delat bez toho delete, to delete to ale hrozne zabiji :(

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Tomas_Dejmek
~ Anonymní uživatel
52 příspěvků
17. 2. 2008   #2
-
0
-

S listama moc nedělám, ale myslim že je problém v tom i++,
zkus místo i++,
i = entities.begin()
Ale nevim jestli předpokládám správně.

Ještě bych zkusil trochu vyladit.
if(!entities.empty()){
for(std::list<entity*>::iterator i=entities.begin();i!=entities.end();){
if((*i)->life<=0)
delete (*i);
i=entities.clear(i);
i = entities.begin();
}
}
zkus.

Nahlásit jako SPAM
IP: 85.160.87.–
17. 2. 2008   #3
-
0
-

Diky, ale moc to nechapu, vzdyt clear to vymaze vsechny, ne?

Jinak uz se mi povedlo udelat,z e to spadne jenom nekdy - a tentokrat uz se to asi netyka tohohle mista - chyba byla v destruktoru te enity :(

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Tomas_Dejmek
~ Anonymní uživatel
52 příspěvků
17. 2. 2008   #4
-
0
-

Jj zrovna jsem se chtěl opravit... mělo tam zustat erase.

Nahlásit jako SPAM
IP: 85.160.87.–
17. 2. 2008   #5
-
0
-

Hmm, tak znova ten samy problem.

Tentokrat potrebuju vymazat (a deletovat) vsechny objekty - clear nemuzu pouzit pac by pak ty objekty zustaly nekde v pameti.

Mam tohle:

	entity* temp;

for(std::list<entity*>::iterator i=entities.begin();i!=entities.end();){
temp=(*i);
i=entities.erase(i);
delete temp; // tady to hazi chybu
}

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Jura
~ Anonymní uživatel
637 příspěvků
17. 2. 2008   #6
-
0
-

Zdravím,

jen upozorním, že volání insert/erase v průchodu nějakého kontejneru je nedefinované, proto ty chyby. jde o to, že pak ty iterátory mohou ukazovat na "špatné" prvky,protože může(ale nemusí) dojít k realokaci toho kontejneru(záležína implmentaci).
Tady je malý příklad z mnoha:



#include <list>
#include <iostream>
#include <algorithm>
#include <cassert>


using std::cout;
using std::endl;


class Cobj
{
public:
int life;
Cobj(int n)
:life(n)
{ cout << "CObj(" << n << ")" << endl;
}

~Cobj()
{ cout << "~CObj(" << life << ")" << endl;
}

};


struct remove_cond: public std::unary_function<Cobj*,bool>
{
remove_cond() {}
bool operator()(Cobj* obj) const
{
if( obj->life <= 0 ) {
delete obj;
return true;
}
return false;
}
};

void print(std::list<Cobj*>::const_iterator start, std::list<Cobj*>::const_iterator fin)
{
for(std::list<Cobj*>::const_iterator i = start;
i != fin; ++i)
cout << (*i)->life << endl;
}
int main()
{
typedef std::list<Cobj*>::iterator list_iter;
std::list<Cobj*> l;

l.push_back(new Cobj(10));
l.push_back(new Cobj(0));
l.push_back(new Cobj(11));
l.push_back(new Cobj(-5));

assert(l.size() == 4);

print(l.begin(), l.end());

list_iter new_end = std::remove_if(l.begin(),l.end(), remove_cond());
l.erase(new_end, l.end());

assert(l.size() == 2);

print(l.begin(), l.end());

//smaze vsechny
for(list_iter i = l.begin(); i != l.end(); ++i)
{ delete *i;
}
l.clear();
// nebo l.erase(l.begin(), l.end());
assert(l.size() == 0);

return 0;
}

Nahlásit jako SPAM
IP: 85.207.192.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 31 hostů

Podobná vlákna

Editace listu listů — založil Matěj Andrle

Vycentrovanie listu — založil Peter

Hledání v listu — založil yaqwsx

Nacitani Listu z XML — založil gabbo

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý