W
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