230 likes | 244 Views
Dive into the world of Standard Template Library (STL) and template programming. Explore parameterized data types, function specialization, containers, algorithms, and iterators. Learn how to effectively use STL for generic programming.
E N D
CS 403: Programming Languages Lecture 24 Fall 2003 Department of Computer Science University of Alabama Joel Jones
Overview • Announcements • Talk today • Colloquim tomorrow at 11AM in Houser 108, Jiageng Li, University of Alabama, Integrated Authorization for Grid System Environments • Review Session next class • Study Guide • MP3 questions • Evaluation Forms • The STL from a comparative programming language standpoint
The Computer Science Department, CS Advisory Board,andACM Student Chapterpresent Mike ThomasCIO, Gulf States Paper “Computer Science in Heterogenous, Multidimensional Business Environments” 5:00-6:00 PM, Tuesday, Dec. 2nd, EE 119 Pizza & drinks served.
Collections • Almost all programming languages support aggregations of primitive types in some way • C has structs, unions, arrays Pair Up: What way of aggregating does Smalltak have? What way of aggregating does Scheme have?
Closures and aggregation • Aggregation is just a simple data type mechanism—what else is needed to have concise powerful? • A lower syntactic overhead way of specifying new behavior that works over an aggregate data structure • Smalltalk: myCollection do: [ code ] • Scheme: (map myList (lambda code )) • Works because the language provides a way of specifying functions “in-place”
C++ Templates • Parameterized data types • Type-safe macros • Come in two types • Class Templates • Function Templates
Class Templates • Can specialize with class (see listing #1) • template <class T> class Stack… • Stack<class Message> • Or any other type • Stack<int>
Class Template Member Functions • Method body must be in .h file
Using a Class Template • See listing #2 • What is the output?
Function Templates • Specialize a function to take polymorphic arguments • Template <class T> T max(T a, T b) • But be careful with pointer types… • See listing #3 • What does it print?
Template Function Specialization • To fix “problem”, use type-specific version: • template<> char* max(char* a, char* b){ return strcmp(a, b) > 0 ? a : b; }
Standard Template Library (STL) • Good reference at: • http://www.sgi.com/tech/stl/ • Generic Programming • specify algorithms and data structures that work with any data type • Core Components • Containers • Algorithms • Iterators
STL: Containers • Data structures that manage a set of memory locations • Doesn’t contain many member functions • Creating, copying, destroying, adding, removing • No pointers to elements • Algorithms do the “day-to-day” stuff
STL: Iterators • Used to traverse elements of containers • Uniform set/naming across containers • Algorithms designed to work with a particular iterator category Random Access Bi-Directional Forward Output Input
STL: Algorithms • Decoupled from containers • Parameterized by iterator types • Algorithm categories: • Non-mutating sequence operations • Mutating sequence operations • Searching and Sorting • Set Operations • Heap operations • Numeric operations • Miscellaneous
Orthogonal Component Structure • So how does this all work together? • vector<int> v(3);v[0] = 7;v[1] = v[0] + 3;v[2] = v[0] + v[1];reverse(v.begin(), v.end()); • So what kind of components are v, v.begin(), and reverse? Algorithm Iterator Container
Example STL: deque • Double-Ended QUEue • Supports: • Random access to elements • Constant time insertion & removal of elements @ end • Linear time insertion and removal of elements in the middle • Constant time insertion & removal of elements @ beginning • What role would the template parameter to deque fulfill?
Example STL: deque • Use: • deque<int> Q;Q.push_back(3);Q.push_front(1);Q.insert(Q.begin() + 1, 2);Q[2] = 0;copy(Q.begin(), Q.end(), ostream_iterator<int>(cout, “ “)); • What does this do?
Example STL: stack<T, Sequence> • Adaptor that supports restricted subset of Container functionality • Insertion, removal, and inspection of element at the top of the stack • Does not allow iteration through its elements
Example STL:stack<T, Sequence> • Example use: • int main() { stack<int> S; S.push(8); S.push(7); S.push(4); assert(S.size() == 3); assert(S.top() == 4); S.pop(); assert(S.top() == 7); S.pop(); assert(S.top() ==8); S.pop(); assert(S.empty());}
Containers • Sequences • vector, deque, list, slist, bit_vector • Associative Containers • set, map, multiset, multimap, hash_set, hash_map, hash_multiset, hash_multimap, hash • String package • char_traits, basic_string, rope (not STL) • Container adaptors • stack, queue, priority_queue, bitset
Algorithms • Non-mutating algorithms • for_each, find,, count, mismatch, equal, search • Mutating algorithms • copy, swap, transform, replace, fill, generate, remove, unique, reverse, rotate, random_shuffle, random_sample, partition, stable_partition, sorting, nth_element, binary search, merge, set operations heap operations, min and max, lexicographical_compare, permutations • Generalized numeric algorithms • iota, accumulate, inner_product, partial_sum, adjacent_difference, power
Iterators • Iterator classes • istream_iterator • ostream_iterator • front_insert_iterator • back_insert_iterator • insert_iterator • reverse_iterator • reverse_bidirectional_iterator • raw_storage_iterator • sequence_buffer