Frage zur Listen und Elementenverteilung
-
Hi,
wie sieht eine Funktion in C++ aus, die eine Liste von Objekten (eigentlich sind diese Zeiger) durchliest und nach einer speizifischen Eigenschaft verteilt die Elemente in 2 anderen Listen. D.h. wir haben eine grosse Liste. Manche Elemente sollen in eine andere Liste verschiebt/kopiert werden. Die andere Elemente, die diese Eigenschaft nicht besitzen, sollen in eine andere Liste kopiert. Ich soll besser STL benutzen.
-
Nur ein Ansatz - verstehen und anpassen mußt du ihn schon selber:
list<data_t> indata,out1,out2; //fülle indata mit allen betrachteten Objekten while(!indata.empty()) if(isok(indata.front()) out1.splice(out1.end(),indata,indata.begin()); else out2.splice(out2.end(),indata,indata.begin());(splice() gibt es nur für list - das hängt einzelne Elemente zwischen verschiedenen Listen um)
-
Wenn deine Liste STL-kompatibel ist, also entsprechende Iteratoren anbietet, kannst du den partition-Algorithmus aus der STL anwenden. Die Elemente bleiben dabei allerdings in derselben Liste, nur dass die, die die Eigenschaft haben, nach vorne sortiert werden. Einen Algorithmus, der zwei neue Listen erzeugt, müsstest du selbst schreiben, das ist aber trivial.
-
Bashar schrieb:
Einen Algorithmus, der zwei neue Listen erzeugt, müsstest du selbst schreiben, das ist aber trivial.
Muss man nicht. Die Methode list::splice kann auch das.
#include <algorithm> // partition #include <iostream> #include <iterator> // back_inserter, ostream_iterator #include <list> struct Eigenschaft { bool operator()( int x ) const { return x % 3 == 0 || x % 7 == 0; // nur als Beispiel } }; int main() { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; std::list< int > l1; std::copy( arr, arr + sizeof( arr )/sizeof( *arr ), std::back_inserter( l1 ) ); // -- hier geht's los std::list< int > l2; l2.splice( l2.end(), l1, l1.begin(), std::partition( l1.begin(), l1.end(), Eigenschaft() ) ); // -- zur Kontrolle alles ausgeben std::copy( l1.begin(), l1.end(), std::ostream_iterator< int >( std::cout << "Die eine Liste: ", " ") ); std::cout << std::endl; std::copy( l2.begin(), l2.end(), std::ostream_iterator< int >( std::cout << "Die andere (durch 3 oder 7 teilbar): ", " ") ); std::cout << std::endl; return 0; }'l1' wird aufgeteilt in 'l2', welches nur die Elemente mit der gewünschten Eigenschaft enthält (hier beispielhaft die Teilbarkeit durch 3 oder 7), und in 'l1' bleiben die anderen zurück.
Gruß
Werner