Download presentation
Presentation is loading. Please wait.
1
Generic programming starts with algorithms
2
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
3
Maximal with respect to what?
4
Lift Maintain usefulness of the algorithm – make efficiency part of the requirements Concrete algorithm A 0 A 1 Lift A m Generic algorithm...
5
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
6
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
7
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
8
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
9
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
10
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
11
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
12
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
13
Forward Container Concept max_element 3 73 7 Generic algorithm on jk jk k = ++j *j = 3 *k = 7 ++i *i i==j
14
What is a concept?
15
Concept IntensionExtension Requirement 1 Requirement 2. Requirement N Abstraction 1 Abstraction 2. Abstraction K.
16
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
17
Example: Polygon Concept IntensionExtension Closed plane figure N sides (for any N)...
18
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
19
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 … …
20
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 http://www.sgi.com/tech/stl Click on any node in the above concept hierarchy to see the corresponding requirements as specified in the SGI STL Programmer’s Guide
21
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
22
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
23
BGL Concepts STL Concepts ContainerIteratorAlgorithmFunctorAdaptor Graph Iterator Graph Incidence Graph Adj. Graph EdgeList Graph … New Concepts in the Boost Graph Library See also http://www.boost.org/libs/graph/doc Graph Algorithms Visitor BFS Visitor DFS Visitor Uniform Cost Visitor … Back
24
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.