Generic programming starts with algorithms
Lift Minimal requirements: works with maximal family of types Concrete algorithm: requires specific data type Less specialized: works with more than one type A 0 A 1 Lift A m Remove an unneeded requirement on the type Generic algorithm... Start here
Maximal with respect to what?
Lift Maintain usefulness of the algorithm – make efficiency part of the requirements Concrete algorithm A 0 A 1 Lift A m Generic algorithm...
float max_element(float a[], int N) { if (N == 0) throw MaxElementEmptyArrayError; int first = 0; float max = a[0]; while (++first < N) if (max < a[first]) max = a[first]; return max; } A Concrete Algorithm
int max_element(float a[], int first, int last) { if (first == last) return first; int result = first; while (++first != last) if (a[result] < a[first]) result = first; return result; } A More Useful Interface
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->next != last) if (result->data data) result = first; return result; } A Linked-List Counterpart
int max_element(float a[], int first, int last) { if (first == last) return first; int result = first; while (++first != last) if (a[result] < a[first]) result = first; return result; } Back to the Array Version
template int max_element(E a[], int first, int last) { if (first == last) return first; int result = first; while (++first != last) if (a[result] < a[first]) result = first; return result; } Generalize the Element Type
template T* max_element(T* first, T* last) { if (first == last) return first; T* result = first; while (++first != last) if (*result < *first) result = first; return result; } From Array Indexing to Pointers
template ForwardIterator max_element(ForwardIterator first, ForwardIterator last) { if (first == last) return first; ForwardIterator result = first; while (++first != last) if (*result < *first) result = first; return result; } Generalize from Pointers to Iterators
int a[] = {6, 3, 7, 5}; int* ai = max_element(a, a+4); vector v(a, a+4); vector ::iterator vi = max_element(v.begin(), v.end()); list x(a, a+4); list ::iterator li = max_element(x.begin(), x.end());... Use with any Container with appropriate iterators
Forward Container Concept max_element Generic algorithm on jk jk k = ++j *j = 3 *k = 7 ++i *i i==j
What is a concept?
Concept IntensionExtension Requirement 1 Requirement 2. Requirement N Abstraction 1 Abstraction 2. Abstraction K.
IntensionExtension Requirement 1 Requirement 2. Requirement N Abstraction 1 Abstraction 2. Abstraction K. An abstraction is in the Extension if and only if it satisfies all of the requirements in the Intension
Example: Polygon Concept IntensionExtension Closed plane figure N sides (for any N)...
Example: Container Concept IntensionExtension 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.... vector, for any T deque for any T list for any T slist for any T set for any T map for any T
A 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 C T … …
Container Associative Container Sorted A. C. Unique A. C. Multiple A. C. Hashed A. C. Unique Sorted A. C. Multiple Sorted A. C. Unique Hashed A. C. Multiple Hashed A. C. Simple A. C. Pair A. C. SetMultisetH. Set H. Multiset H. Multi- map H. Map Multimap Front Insertion Sequence Back Insertion Sequence Random Access Container Forward Container SequenceReversible Container List Vector Deque Front & Back Insertion Sequence Slist STL Container Concepts Back See also Click on any node in the above concept hierarchy to see the corresponding requirements as specified in the SGI STL Programmer’s Guide
Container Forward Container Sequence Front Insertion Sequence Back Insertion Sequence Reversible Container Random Access Container List Vector Deque Front & Back Insertion Sequence Slist STL Generic Algorithms on Forward Containers Requires input iterators Enables generic algorithms copy, for_each, equal, transform, … Requires forward iterators Enables find, merge, fill, replace, generate, remove, unique, rotate, … … Requires bidirectional iterators Enables reverse, partition, inplace_merge, … Requires random access iterators Enables sort, binary_search, random_shuffle, … Back
Container Forward Container Associative Container STL Concepts Input Iterator Output Iterator Forward Iterator Bidirectional Iterator Random Access Iterator AlgorithmFunctorAdaptor Input Algorithm Output Algorithm Forward Algorithm Bidirectional Algorithm Random Access Algorithm Unary Functor Binary Functor Binary Predicate Order Relation Iterator Adaptor Back
BGL Concepts STL Concepts ContainerIteratorAlgorithmFunctorAdaptor Graph Iterator Graph Incidence Graph Adj. Graph EdgeList Graph … New Concepts in the Boost Graph Library See also Graph Algorithms Visitor BFS Visitor DFS Visitor Uniform Cost Visitor … Back
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. Brőnnimann, S. Schirra, R. Veltkamp, …) Generic Libraries Designed and Developed Via the Concept-Based Approach