Computer Engineering Department
Faculty of Engineering
Cairo University
Advanced Programming Techniques
Spring 2010
C++ Templates Case Study
Advanced
Programming
Advanced
Programming
Spring
2010
Spring
2010
Section
1-Case
Study
Section
1-Case
Study
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 element
1. in an arbitrary traversable list of arbitrary
type
2. according to arbitrary comparison criterion.
Advanced Programming
Spring 2010
Section 1-Case Study
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;
}
Advanced Programming
Spring 2010
Section 1-Case Study
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;
}
Advanced Programming
Spring 2010
Section 1-Case Study
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;
}
Advanced Programming
Spring 2010
Section 1-Case Study
2-Supporting Arbitrary Criterion (cont.)
Comparison can be done using:
- A function
- An object implementing () operator:“Functor”
Advanced Programming
Spring 2010
Section 1-Case Study
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>);
Advanced Programming
Spring 2010
Section 1-Case Study
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));
Advanced Programming
Spring 2010
Section 1-Case Study
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
Advanced
Programming
Programming
Spring 2010
Section
1-Case1-STL
Study
Section
Supporting Arbitrary List (Cont.)
To invoke findMin on an array:
int array[50];
int* minPtr = findMin(array, array+50,
lessThan<int>);
min = *minPtr;
Advanced Programming
Spring 2010
Section 1-Case Study
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 !
Advanced Programming
Spring 2010
Section 1-Case Study
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)
Advanced Programming
Spring 2010
Section 1-Case Study
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;
}
Advanced Programming
Spring 2010
Section 1-Case Study
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;
Advanced Programming
Spring 2010
Section 1-Case Study
© Copyright 2026 Paperzz