200 likes | 216 Views
Delve into C++ templates, including class and function templates, and the Standard Template Library (STL) for generic programming with containers and algorithms. Understand the role of iterators and explore examples of deque and stack implementations.
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