14
Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced Programming Advanced Programming Techniques Spring 2010 C++ Templates Case Study Spring 2010

Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

Embed Size (px)

Citation preview

Page 1: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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

Page 2: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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.

Page 3: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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;}

Page 4: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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;

}

Page 5: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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;

}

Page 6: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

Section 1-Case StudyAdvanced Programming Spring 2010

2-Supporting Arbitrary Criterion (cont.)

Comparison can be done using:- A function

- An object implementing () operator:“Functor”

Page 7: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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>);

Page 8: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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));

Page 9: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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

Page 10: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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;

Page 11: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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 !

Page 12: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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)

Page 13: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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;}

Page 14: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced

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;