Title: Generic programming starts with algorithms
1Generic programming starts with algorithms
2Minimal requirements works with maximal family
of types
A
Generic algorithm
m
Lift
. . .
Remove an unneeded requirement on the type
Lift
Less specialized works with more than one type
A
1
Lift
A
Start here
Concrete algorithm requires specific data type
0
3Maximal with respect to what?
4Maintain usefulness of the algorithm make
efficiency part of the requirements
A
Generic algorithm
m
Lift
. . .
Lift
A
1
Lift
A
Concrete algorithm
0
5 A Concrete Algorithm
float max_element(float a, int
N) if (N 0) throw MaxElementEmptyArra
yError int first 0 float max a0
while (first lt N) if (max lt afirst)
max afirst return max
6 A More Useful Interface
int max_element(float a, int
first, int last) if (first last)
return first int result first while
(first ! last) if (aresult lt afirst)
result first return result
7 A Linked-List Counterpart
float_list_node max_element(float_list_node
first, float_list_node last) if
(first last) return first
float_list_node result first while
(first-gtnext ! last) if (result-gtdata lt
first-gtdata) result first return
result
8 Back to the Array Version
int max_element(float a, int
first, int last) if (first last)
return first int result first while
(first ! last) if (aresult lt afirst)
result first return result
9 Generalize the Element Type
template lttypename Egtint max_element(E a,
int first, int last) if (first
last) return first int result first
while (first ! last) if (aresult lt
afirst) result first return result
10 From Array Indexing to Pointers
template lttypename TgtTmax_element(T first,
T last) if (first last)
return first T result first while
(first ! last) if (result lt first)
result first return result
11 Generalize from Pointers to Iterators
template lttypename ForwardIteratorgtForwardIterat
or max_element(ForwardIterator first,
ForwardIterator last) if (first last)
return first ForwardIterator result
first while (first ! last) if (result
lt first) result first return result
12 Use with any Container with appropriate iterators
int a 6, 3, 7, 5int ai
max_element(a, a4)vectorltintgt v(a,
a4)vectorltintgtiterator vi
max_element(v.begin(), v.end())listltintgt x(a,
a4) listltintgtiterator li
max_element(x.begin(), x.end()). . .
13Generic algorithm on
max_element
i
Forward Container Concept
i
ij
k jj 3k 7
j
k
j
k
7
3
3
7
max_element
max_element
14What is a concept?
15Intension
Extension
Abstraction 1 Abstraction 2 . . . Abstraction
K . . .
Requirement 1 Requirement 2 . . . . Requirement N
Concept
16Intension
Extension
Abstraction 1 Abstraction 2 . . . Abstraction
K . . .
Requirement 1 Requirement 2 . . . . Requirement N
An abstraction is in the Extension if and only if
it satisfies all of the requirements in the
Intension
17Intension
Extension
Closed plane figure N sides (for any N)
. . .
Example Polygon Concept
18Intension
Extension
Must be a type whose objects can store other
objects (elements) Must have an associated
iterator type that can be used to traverse
through the elements.
vectorltTgt, for any T dequeltTgt for any T listltTgt
for any T slistltTgt for any T setltTgt for any
T mapltTgt for any T
. . .
Example Container Concept
19A
C
Algorithm A works with every type T in concept C
Definition an algorithm is generic if it works
with every type in a concept
works is correct and efficient
20STL Container Concepts
Container
?Back
21STL Generic Algorithms on Forward Containers
Requires input iterators
Enables generic algorithms copy, for_each,
equal, transform,
?Back
Container
Requiresforward iterators
ForwardContainer
Enables find, merge, fill, replace, generate,
remove, unique, rotate,
Requiresbidirectional iterators
Enables reverse, partition, inplace_merge,
Sequence
ReversibleContainer
Front InsertionSequence
BackInsertionSequence
Requiresrandom access iterators
Enables sort, binary_search, random_shuffle,
Random AccessContainer
Front BackInsertionSequence
Vector
Slist
List
Deque
22?Back
STL Concepts
Container
Iterator
Algorithm
Functor
Adaptor
ForwardContainer
AssociativeContainer
Input Iterator
Output Iterator
Input Algorithm
Output Algorithm
Unary Functor
BinaryFunctor
Iterator Adaptor
Forward Iterator
Forward Algorithm
BinaryPredicate
Bidirectional Iterator
Bidirectional Algorithm
OrderRelation
Random Access Iterator
Random Access Algorithm
23New Concepts in the Boost Graph Library
?Back
STL Concepts
Container
Iterator
Algorithm
Functor
Adaptor
See also http//www.boost.org/libs/graph/doc
24Generic Libraries Designed and Developed Viathe
Concept-Based Approach
- Standard Template Library (HP, RPI, SGI)
- Matrix Template Library (Indiana U.)
- Boost Graph Library (Indiana U.)
- Parallel Boost Graph Library (D. Gregor RPI
PhD, Indiana U.) - Boost Array Library (N. Josuttis)
- Boost Multi-Array Library (Indiana U.)
- Boost Basic Linear Algebra Library (J. Walter, M.
Koch) - Boost Property Map Library (Indiana U.)
- Boost Random Number Generator Library (J. Mauer)
- Boost Threads Library (W. Kempf)
- Boost Concept Checking Library (Indiana U.)
- Computational Geometry Algorithms Library (H.
Bronnimann, S. Schirra, R. Veltkamp, )