Announcement • Final exam Standard Template Library II – Tuesday, May 20 th – 2:45 – 4:45pm – Rm 70-1620 Announcement Speaking of Exams • For those taking SE1 in the fall • There will be no exam this week – Now a studio course • Next exam: – No need to sign up for lecture and lab – May 1 st – Register for one studio section. – Topic list to come Projects The Plan Mandlebrot table on Web is now fixed. • Today: STL 1 • Wednesday: STL 2 deliverable: • Thursday: Smart Pointers – File Image: OPEN TILL END OF TODAY – Fractal Image: Due May 2 nd • Questions?
The Standard Template Library STL Components • A general-purpose C++ library of • containers algorithms and data structures – classes that hold stuff • Based on a concept known as generic • iterators programming – Used to iterate through containers • Implemented by means of the C++ – Generalization of C++ pointers template mechanism • generic algorithms • Part of the standard ANSI C++ library – Templated functions • util package for C++ STL Components Plan for Today • function objects (Functors) • More complex containers – Objects that overload operator(); • Algorithms – Substitute for pointers to functions • Function – Beyond the scope of this course • adaptors – adapt other components to special purposes. – Queues and stacks are adaptors • Allocators – encapsulate a memory model. – decouple the algorithms from assumptions about a particular model. Sorted Containers Sorted Containers set<int, less<int> > s; • Objects are maintained in sorted order multiset<int, less<int> > ms; • Requires Comparator function for (int i = 0; i < 10; i++) { • Examples s.insert(i); s.insert(i * 2); – Set – Collection of unique values ms.insert(i); ms.insert(i * – Multiset – Collection of non-unique values 2); } s = 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 ms = 0 0 1 2 2 3 4 4 5 6 6 7 8 8 9 10 12 14 16 18
Associative Containers Maps map<string, int, less<string> > mymap; • Associates a key object with a value object (Dictionary) mymap.insert(value_type(string("January"), 31)); • Container holds a pair of objects mymap.insert(value_type(string("February"), 28)); – Accessed via predefined value_type map<string, int, less<string>>::iterator it = mymap.find (string “January”); • Examples map<string, int, less<string>>::value_type V = (*it); – map cout << V.first(); // prints out key (January) – hash_map cout << V.second(); //prints out value (31) typedef Maps typedef map<string, int, less<string> > monthmap; • Means to define a new typename monthmap mymap; • Makes Template types more manageable mymap.insert(value_type(string("January"), 31)); typedef definition typename mymap.insert(value_type(string("February"), 28)); monthmap::iterator it = mymap.find (string “January”); monthmap:: value_type V = (*it); cout << V.first(); // prints out key (January) cout << V.second(); //prints out value (31) Bitsets Bitsets • space-efficient support for sets of bits. bitset<16> b1("1011011110001011"); bitset<16> b2; • operator[] overloaded to provide access to individual bits b2 = ~b1; • NOT the same as a vector of bool for (int i = b2.size() - 1; i >= 0; i--) cout << b2[i];
strings basic_string • strings are actually the char instantiation • Provides capabilities: of the STL basic_string template – Compare (which is a container class). – Append – Assign – Insert template <class charT, class traits = char_traits<charT>, – Remove class Allocator allocator<charT> > – Replace class basic_string; – various searches typedef basic_string <char> string; – Iterator access Other containers Algorithms • There are others: • A set of commonly used templated functions. – See SGI docs for full list • Many work on container objects – Iterators passed in to indicate positions within containers • Questions? Algorithms Algorithms list<int> nums; template <class Iterator, class T> list<int>::iterator nums_iter; Iterator find (Iterator first, Iterator last, const T & value) nums.push_back (3); { nums.push_back (7); for (Iterator i = first; i != last && nums.push_front (10); *i != value; ++i); // Search the list return i; nums_iter = find(nums.begin(), nums.end(), 3); } if (nums_iter != nums.end()) { /* found */ } else { /* not found */ }
Abridged Catalogue of Abridged Catalogue of algorithms algorithms • Searching & replacing • Filling & generating – find, find_if, find_first_of, replace, – Fills or a range with a particular value (constant or replace_if generated) • Takes predicate as argument! FUNCTOR – fill, fill_n, generate, generate_n – max_element, min_element – search (range searches) • Counting • Comparing ranges – count, count_if (counts elements w/a given value) – equal, mismatch • Manipulating sequences • Removing elements – copy, reverse, swap, random_shuffle – remove, unique (removes duplicates) Abridged Catalogue of Functors algorithms • Sorting • Function Objects (or Functors) – sort, partial_sort, nth_element – Objects that represent functions – binary_search, lower_bound, upper_bound – Overrides operator() – merge – Functors are Templated – set_union, set_difference, set_intersection • Applying an operation to each element – for_each, transform – But why bother when you have functions? • Takes operation as argument! FUNCTOR! • Remember maps • Numeric Algorithms map<string, int, less<string> > – Accumulate, partial_sum mymap; Functors Functors template <class T> struct less : public • STL Predicates (returns bool) binary_function<T, T, bool> { equal_to arg1 == arg2 bool operator() (const T &x, const T &y) const not_equal_to arg1 != arg2 { return x < y; } greater arg1 > arg2 } less arg1 < arg2 greater_equal arg1 >= arg2 less_equal arg1 <= arg2 Note: will only work if < is defined for T. logical_and arg1 && arg2 logical_or arg1 || arg2 logical_not !arg
Functors Functors • STL Arithmetic functors // Set up a vector vector<int> v; plus arg1 + arg2 minus arg1 - arg2 // Setup a function object multiplies arg1 * arg2 out_times_x<int> f2(2); divides arg1 / arg2 // Apply function modulus arg1 % arg2 for_each (v.begin(),v.end(),f2); negate - arg1 // Will apply f2 to each element in v // f2.operator() (int) best be defined Functors and Algorithms Questions • Note that generic algorithms do not care if the operation argument is – A function – A pointer to a function – Functor • But why use STL? Top 5 Reasons to use STL Top 5 Reasons to use STL "/opt/SUNWspro/SC5.0/include/CC/./algorithm.cc", line 5. Source, 2K / Executable 1.5M 1015: Error: The operation "std::list<int, std::allocator<int>>::iterator - std::list<int, 4. Who needs understandable compiler errors? std::allocator<int>>::iterator" is illegal. "/opt/SUNWspro/SC5.0/include/CC/./algorithm", line 776: Where: While instantiating "std::__final_insertion_sort<std::list<int,std::alloc ator<int>>::iterator>(std::list<int, std::allocator<int>>::iterator, std::list<int, std::allocator<int>>::iterator)". "/opt/SUNWspro/SC5.0/include/CC/./algorithm", line 776: Where: Instantiated from non-template code.
Top 5 Reasons to use STL But seriously… • Lots of functionality 5. Source, 2K / Executable 1.5M • Efficiency 4. Who needs understandable compiler errors? – very good performance at low run-time space cost 3. Who needs understandable linker errors? – Generalized algorithms are only provided when their 2. Why make your program look overly complicated efficiency is good. when STL can do it for you? – The implementation of the containers and algorithms of 1. Now there’s a standard way to access elements the STL is not specified in the standard, but the beyond the bounds of an array! efficiency of each algorithm is. Reading the docs Summary • There’s no standard STL docs • Advanced STL Containers – No man for STL • Algorithms – Except, perhaps the ANSI spec • Functors – Docs on webpage • From STL vendors • Questions? – Roguewave – SGI – categorizes templates • Tomorrow: Smart Pointers
Recommend
More recommend