Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.07.2008, 15:32

C++ STL Listen -> Listenelement löschen in einer Schleife

Hi,

Ich habe follgendes vor:

Eine Liste mit Instanzen einer Klasse füllen diese Liste möchte ich dann mithilfe eines Iterators in einer Schleife durchlaufen und alle Instanzen dessen Rückgabewert 1 bei der Funktion Ubdate ist aus der Liste entfernen.

Ich kann mich dunkel Erinnern, dass ich so etwas schon mal probiert habe und es auch geschafft habe. Es war aber nicht so ganz einfach und deswegen frage ich lieber nochmal nach wie man so etwas genau machen muss.

Ich glaube follgende Lösung funktioniert nicht verdeutlich aber dafür evtl nochmal, was ich vorhabe ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    list<CBlock>::iterator itBlocks = m_lBlocks.begin ();

     //Blöcke durchlaufen

    while (itBlocks != m_lBlocks.end())
    {
        
    if( itBlocks->Ubdate(m_Player) == 1)
      itBlocks.remove ();

     itBlocks++;
    }


Ich würde mich über eine Lösung freuen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

14.07.2008, 15:50

Sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
bool pred( const CBlock& v )
{
    return v.Ubdate() == 1;
}

// ...


v.erase( std::remove_if( v.begin(), v.end(), &pred ), v.end() ); 


Oder so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
struct remove_pred : std::unary_function< bool, CBlock>
{
    bool operator()( const CBlock& v ) const
    {
        return v.Ubdate() == 1;
    }

} pred;

v.erase( std::remove_if( v.begin(), v.end(), pred ), v.end() ); 
@D13_Dreinig

3

14.07.2008, 16:06

oder so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
std::list<GameObject> ObjectList;
for(std::list<GameObject>::iterator ObjectIterator=ObjectList.begin(); ObjectIterator!=ObjectList.end(); )
{
 if(ObjectIterator->Ungülitg())//wenn das objekt auf das iterator zeigt ungültig ist, also gelöscht werden soll

 {
   ObjectIterator=ObjectList.erase(ObjectIterator);//Element löschen und Iterator afs nächste zeigen lassen.

 }
 else//damit es nicht zu evtl. speicherüberschreitungen kommen kann

 {
   ++ObjectIterator;
  }
}
Lieber dumm fragen, als dumm bleiben!

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

14.07.2008, 16:13

Ich würd Jonathans Lösung den Zuschlag geben, da sie sich an dem bereits vorhandenen Lösungsansatz von Abcd1234 orientiert^^

5

14.07.2008, 17:09

Ich hab mich jetzt an Johnatans Codebeispiel Orientiert, da dies für mich persönlich leichter nachzuvollziehen ist und habe nun follgende Lösung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    list<CEnemy_CanBallSmall>::iterator itEnemy3;

    for(itEnemy3 = m_lEnemy3.begin(); itEnemy3 != m_lEnemy3.end();)
    {
        //Wenn Kugel maximale Flugbahn zurückgelegt hat -> aus liste entfernen

         if(itEnemy3->Update() == 3)
            itEnemy3 = m_lEnemy3.erase(itEnemy3);
         else
             itEnemy3++;

    }


Mache ich hier jetzt alles richtig?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

14.07.2008, 17:22

Grundsätzlich ja,aber David's Lösungen wären diesen eigetlich vorzuziehen, aber kannst du machen, wie du willst. ;)

Werbeanzeige