Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objetkte aus einer Liste holen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.09.2018, 11:26 Uhr
karl_cpp



Hallo,

Ich habe eine Liste (Ursprungsliste) mit eigenen Objekten. Alle Objekte, die eine bestimmte Eigenschaft haben, möchte ich in eine andere Liste (Zielliste), gleichen Typs, verschieben. D.h., wenn die Ursprungsliste beispielsweise 10 Objekte hat, von denen 4 die gewünschte Eigenschaft besitzen, dann soll danach die Zielliste 4 Einträge haben und die Ursprungsliste 6 Einträge.


C++:
std::list<MyObj> source; // Hat bereits Einträge
std::list<MyObj> target; // Ist noch leer

for( MyObj & obj : source )
{
    // Wenn das Objekt die gewünschte Eigenschaft hat...
    if( obj.hasProperty() )
    {
        // ...dann in die Zielliste verschieben
        target.push_back( std::move( obj ) );
    }
}



Dieser Ansatz funktioniert leider nicht. In der Zielliste sind zwar die gewünschten Objekte, aber in der Ursprungsliste sind die Objekte auch noch enthalten. Kann mir jemand sagen, was ich da falsch mache? Ich dachte, "move" verschiebt die Objekte?

Dieser Ansatz funktioniert, ist aber "umständlicher":


C++:
std::list<MyObj> source; // Hat bereits Einträge
std::list<MyObj> target; // Ist noch leer

size_t num = source.size();
for( int i = 0; i < num; ++i )
{
    // Objekt aus der Ursprungsliste herausholen
    MyObj obj = source.front();
    source.pop_front();

    // Wenn das Objekt die gewüschte Eigenschaft hat...
    if( obj.hasProperty() )
    {
        // ...dann in die Zielliste einfügen
        target.push_back( obj );
    }
    else
    {
        // ...sonst zurück in die Ursprungsliste
        source.push_back( obj );
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.09.2018, 18:02 Uhr
ao

(Operator)


Ich weiß es gerade nicht genau und hab auch keine Zeit, genauer nachzuforschen, aber es könnte sein, dass du einen Move-Iterator brauchst.

Google mal "stl move objects between containers"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.09.2018, 22:45 Uhr
karl_cpp



Danke für den Hinweis.

Ich bin auf folgendes gestossen:


C++:
std::list<MyObj> source; // Hat bereits Einträge
std::list<MyObj> target; // Ist noch leer

std::copy_if( std::make_move_iterator( begin( source ) ),
    std::make_move_iterator( end( source ) ),
    std::back_inserter( target ),
    []( MyObj const& obj ){ return obj.hasProperty(); } );



Bei Gelegenheit muss ich mal ausprobieren, ob das so funktioniert, wie ich mir das vorstelle.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.09.2018, 00:57 Uhr
karl_cpp



Obiges (copy_if mit move_iterator ) habe ich mal mit string-Objekten ausprobiert.
Die Objekte werden zwar von der source- in die target-Liste verschoben und sogar aus der source-Liste herausgenommen, es bleiben aber leere Objekte zurück. Für mein Problem ist diese Lösung also auch nicht so ohne weiteres geeignet.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.09.2018, 22:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
evtl ist es für dich einfacher, statt moven zu wollen, einfach einen shared-ptr in die liste zu speichern, dann kannst du ihn auch einfach aus source löschen und du ja "nur" den pointer kopieren musst
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: