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...
![Page 1: Section 1-Case Study Advanced Programming Spring 2010 Computer Engineering Department Faculty of Engineering Cairo University Section 1-Case Study Advanced.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/1.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/2.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/3.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/4.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/5.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/6.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/7.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/8.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/9.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/10.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/11.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/12.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/13.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022072005/56649f3f5503460f94c5fef4/html5/thumbnails/14.jpg)
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;