diff options
Diffstat (limited to 'Bachelor/Prog2/SortedList2')
| -rw-r--r-- | Bachelor/Prog2/SortedList2/Compare.h | 20 | ||||
| -rw-r--r-- | Bachelor/Prog2/SortedList2/SL_test.cpp | 75 | ||||
| -rw-r--r-- | Bachelor/Prog2/SortedList2/SortedList.h | 63 |
3 files changed, 158 insertions, 0 deletions
diff --git a/Bachelor/Prog2/SortedList2/Compare.h b/Bachelor/Prog2/SortedList2/Compare.h new file mode 100644 index 0000000..336cf08 --- /dev/null +++ b/Bachelor/Prog2/SortedList2/Compare.h @@ -0,0 +1,20 @@ +// Function-object to compare two objects.
+// This template needs operator<() for objects of type T, but it is possible to
+// specialize it for any given type so that this template is not used.
+// Author: U.Breymann / H.P.Weber
+// Date: 05.05.05
+
+#ifndef COMPARE_H
+#define COMPARE_H
+
+template<class T>
+class Compare {
+public:
+ bool operator()( const T& a, const T& b ) const
+ {
+ return a < b;
+ }
+};
+
+#endif
+
diff --git a/Bachelor/Prog2/SortedList2/SL_test.cpp b/Bachelor/Prog2/SortedList2/SL_test.cpp new file mode 100644 index 0000000..f836972 --- /dev/null +++ b/Bachelor/Prog2/SortedList2/SL_test.cpp @@ -0,0 +1,75 @@ +// Driver for SortedList
+// Author: U.Breymann / H.P.Weber
+// Date: 05.05.05
+
+#include <iostream>
+using std::cout;
+using std::endl;
+
+#include <iomanip>
+using std::setw;
+
+#include <algorithm> // std::copy
+
+#include <cmath> // sin()
+#include <cstdlib> // abs(int)
+
+#include "SortedList.h"
+
+template <>
+class Compare< int > { // specialization
+public:
+ enum sortCriterion{ increasing, decreasing, absoluteValue };
+ Compare( sortCriterion s = increasing ) : howToSort( s ) { } // Constructor
+ bool operator()( const int& a, const int& b ) const
+ {
+ bool result;
+ switch( howToSort ) {
+ case increasing: result = a < b; break;
+ case decreasing: result = a > b; break;
+ case absoluteValue: result = abs(a) < abs(b); break;
+ default: throw "Compare.operator()(): default darf nicht erreicht werden";
+ }
+ return result;
+ }
+private:
+ sortCriterion howToSort;
+};
+
+int main()
+{
+ Compare< int > absolute( Compare< int >::absoluteValue );
+ SortedList< int > sortedList, sortedListAbsolute( absolute );
+ std::ostream_iterator< int > output( cout, "\t" );
+
+ cout << "Werte mit verschiedenen Vorzeichen einfuegen:\n";
+ for( int i = 0; i < 7; ++i ) {
+ int value = int( 100.0 * sin( static_cast< float >( i ) ) );
+ cout << *sortedList.insert( value ) << endl;
+ sortedListAbsolute.insert( value );
+ }
+
+ cout << "\nincreasing sortiert( default ):\n";
+ std::copy( sortedList.begin(), sortedList.end(), output );
+
+ cout << "\n\nnach Absolutbetrag sortiert:\n";
+ std::copy( sortedListAbsolute.begin(), sortedListAbsolute.end(), output );
+
+ cout << "\n\nWert 90 finden" << endl;
+ SortedList< int >::Iterator search = sortedList.find( 90 );
+ if( search == sortedList.end() )
+ cout << "nicht gefunden\n";
+ else
+ cout << *search << " gefunden" << endl;
+
+ cout << "\nWert 91 finden" << endl;
+ search = sortedList.find( 91 );
+ if( search == sortedList.end() )
+ cout << "nicht gefunden\n\n";
+ else
+ cout << *search << " gefunden" << endl << endl;
+
+ return 0;
+}
+
+
diff --git a/Bachelor/Prog2/SortedList2/SortedList.h b/Bachelor/Prog2/SortedList2/SortedList.h new file mode 100644 index 0000000..300bd74 --- /dev/null +++ b/Bachelor/Prog2/SortedList2/SortedList.h @@ -0,0 +1,63 @@ +// Template for sorted list
+// Author: U.Breymann / H.P.Weber
+// Date: 05.05.05
+
+#ifndef SORTEDLIST_H
+#define SORTEDLIST_H
+
+#include <list>
+#include <algorithm> // find
+
+#include "compare.h"
+
+template< class T >
+class SortedList
+{
+public:
+ typedef std::list< T >::iterator Iterator;
+ typedef std::list< T >::const_iterator ConstIterator;
+ SortedList( const Compare< T >& cmp = Compare< T >() ) : comp( cmp ) { }
+ virtual ~SortedList() { }
+
+ bool empty() const { return myList.empty(); }
+ int size() const { return myList.size(); }
+
+ // take first or last element
+ void pop_front() { myList.pop_front(); }
+ void pop_back() { myList.pop_back(); }
+
+ // read first or last element
+ T& front() { return myList.front(); }
+ const T& front() const { return myList.front(); }
+ T& back() { return myList.back(); }
+ const T& back() const { return myList.back(); }
+
+ Iterator begin() { return myList.begin(); }
+ ConstIterator begin() const { return myList.begin(); }
+ Iterator end() { return myList.end(); }
+ ConstIterator end() const { return myList.end(); }
+
+ void erase( Iterator& pos ) { myList.erase( pos ); }
+
+ // find element
+ Iterator find( const T& value )
+ {
+ return std::find( myList.begin(), myList.end(), value );
+ }
+
+ // sorted insert
+ Iterator insert( const T& value )
+ {
+ // find place to insert
+ Iterator temp( begin() );
+ while( temp != end() && comp( *temp, value ) ) ++temp;
+ return myList.insert( temp, value );
+ }
+
+private:
+ std::list< T > myList;
+ Compare< T > comp;
+};
+
+#endif
+
|
