Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of...
-
Upload
kathryn-clarke -
Category
Documents
-
view
214 -
download
1
Transcript of Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of...
Section 1-Case StudyAdvanced Programming Spring 2010
Computer Engineering DepartmentFaculty of EngineeringCairo University
Section 1-Case StudyAdvanced Programming
Advanced Programming TechniquesSpring 2010
C++ Templates Case Study
Spring 2010
Section 1-Case StudyAdvanced Programming Spring 2010
Case-Study
• What we have: A function that retrieves the minimum float in an array of floats
• What we want: A function that retrieves the minimum element1. in an arbitrary traversable list of arbitrary
type
2. according to arbitrary comparison criterion.
Section 1-Case StudyAdvanced Programming Spring 2010
Case-Study (Cont.)
int findMin(float arr[], int n){int min = 0;
for(int i = 0; i < n; i++){
if(arr[i] < arr[min]) {min = i;}}
return min;}
Section 1-Case StudyAdvanced Programming Spring 2010
1-Supporting Arbitrary Type
template<class T>
int findMin(T arr[], int n)
{
int min = 0;
for(int i = 0; i < n; i++)
{
if(arr[i] < arr[min]) {min = i;}
}
return min;
}
Section 1-Case StudyAdvanced Programming Spring 2010
2-Supporting Arbitrary Criterion
template<class T, class Comparison>int findMin(T arr[], int n, Comparison c){ int min = 0;
for(int i = 0; i < n; i++){
if(c(arr[i], arr[min])) {min = i;}}return min;
}
Section 1-Case StudyAdvanced Programming Spring 2010
2-Supporting Arbitrary Criterion (cont.)
Comparison can be done using:- A function
- An object implementing () operator:“Functor”
Section 1-Case StudyAdvanced Programming Spring 2010
Supporting Arbitrary Criterion (Cont.)
Example using a function:template<class T>bool lessThan(const T &s1, const T &s2) {return s1 < s2;}
int[10];int minIdx = findMin(array, 10, lessThan<int>);
Section 1-Case StudyAdvanced Programming Spring 2010
2-Supporting Arbitrary Condition (Cont.)
Example using a Functor:class CourseComp{
public: CourseComp(int courseKey): mKey(courseKey) {}bool operator()(const Student &s1, const Student &s2) {return s1.getGrade(mKey) < s2.getGrade(mKey);}
private: int mKey;}
Student array[10];Int lowestIn450 = findMin(array, 10,
CourseComp(450));
Section 1-Case StudyAdvanced Programming Spring 2010
Supporting Arbitrary List
Let’s first rewrite the function as follows
template<class T, class Comparison>T* findMin(T* begin, T* end, Comparison c){
T* min = begin;
for(T* it = begin; it != end; ++it){
if(c(*it, *min)) {min = it;}}
return min;}
How can it be invoked ???
Advanced Programming Section 1-STL
Section 1-Case StudyAdvanced Programming Spring 2010
Supporting Arbitrary List (Cont.)
To invoke findMin on an array:
int array[50];int* minPtr = findMin(array, array+50, lessThan<int>);
min = *minPtr;
Section 1-Case StudyAdvanced Programming Spring 2010
Supporting Arbitrary List (Cont.)
We can further rewrite the function as follows
template<class T, class Comparison>T findMin(T begin, T end, Comparison c){
T min = begin;
for(T it = begin; it != end; ++it){
if(c(*it, *min)) {min = it;}}
return min;}
And it should still work !
Section 1-Case StudyAdvanced Programming Spring 2010
Supporting Arbitrary List (Cont.)
• Suppose we have a linked list
struct Node{
int mData;Node *mNext;
}Node *list;
How can we use findMin to find the minimum element in the linked list ??? (No code changes)
Section 1-Case StudyAdvanced Programming Spring 2010
Supporting Arbitrary List (Cont.)
Let’s create our own iterator:
struct ListIterator{
Listiterator(Node *node) : mCurrent(node) {}
ListIterator &operator++() {
mCurrent = mCurrent->mNext;return *this;
}const int & operator *() {return mCurrent->mData;}
Node *mCurrent;}
Section 1-Case StudyAdvanced Programming Spring 2010
Supporting Arbitrary List (Cont.)
To invoke findMin for the linked list:
ListIterator b(list);ListIterator e(null);
ListIterator minIt = findMin (b, e, lessThan<int>);Int min = *minIt;