200 likes | 216 Views
CS 403 - Programming Languages. Class 23 November 16, 2000. Today’s Agenda. Augment Chapter 10 Quick (Re)Introduction to C++ Templates Overview of the Standard Template Library Example Code: deque & stack Announcement: . Programming Assignment, due next week. C++ Templates.
E N D
CS 403 - Programming Languages Class 23 November 16, 2000
Today’s Agenda • Augment Chapter 10 • Quick (Re)Introduction to C++ Templates • Overview of the Standard Template Library • Example Code: deque & stack • Announcement:. • Programming Assignment, due next week
C++ Templates • Parameterized data types • Type-safe macros • Come in two types • Class Templates • Function Templates
Class Templates • Can specialize 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) • 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 • 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