CSE 333 Lecture 12 - templates, STL Hal Perkins Department of Computer Science & Engineering University of Washington
CSE333 lec 12 C++.4 // 07-20-16 // Perkins
Administrivia HW2 due Thursday night, 11 pm. - if not started yet if done - BE SURE TO CHECK YOUR WORK (git clone/checkout, make, tests, …)
Exam Monday, in class - Closed book, no notes — exam questions can be more straightforward that way;
reference info on test as needed - Topics: everything from lectures, exercises, project, etc. up to HW2 & basics of C++
(including references, const, classes, constructors, destructors, new/delete, nothing after that) - Old exams and topic list on the web now - Review Sunday, 2 pm, location TBA
No more exercises until (right) after the exam CSE333 lec 12 C++.4 // 07-20-16 // Perkins
Today’s goals Templates and type-independent code
C++’s standard library - STL containers, iterators, algorithms •
A few core ones only - see docs & Primer for others
CSE333 lec 12 C++.4 // 07-20-16 // Perkins
Suppose that... You want to write a function to compare two ints:
// returns 0 if equal, 1 if value1 is bigger, -1 otherwise int compare(const int &value1, const int &value2) { if (v1 < v2) return -1; if (v2 < v1) return 1; return 0; }
CSE333 lec 12 C++.4 // 07-20-16 // Perkins
Suppose that... You want to write a function to compare two ints, and you also want to write a function to compare two strings: // note the cool use of function overloading! // returns 0 if equal, 1 if value1 is bigger, -1 otherwise int compare(const int &value1, const int &value2) { if (value1 < value2) return -1; if (value2 < value1) return 1; return 0; } // returns 0 if equal, 1 if value1 is bigger, -1 otherwise int compare(const string &value1, const string &value2) { if (value1 < value2) return -1; if (value2 < value1) return 1; return 0; } CSE333 lec 12 C++.4 // 07-20-16 // Perkins
Hmm.... The two implementations of compare are nearly identical. - we could write a compare for every comparable type ‣
but, that’s obviously a waste; lots of redundant code!
Instead, we’d like to write “generic code” - code that is type-independent - code that is compile-time polymorphic across types
CSE333 lec 12 C++.4 // 07-20-16 // Perkins
C++: parametric polymorphism C++ has the notion of templates - a function or class that accepts a type as a parameter ‣
you implement the function or class once, in a type-agnostic way
‣
when you invoke the function or instantiate the class, you specify (one or more) types, or values, as arguments to it
- at compile-time, when C++ notices you using a template... ‣
the compiler generates specialized code using the types you provided as parameters to the template
CSE333 lec 12 C++.4 // 07-20-16 // Perkins
Function template You want to write a function to compare two things: #include #include // returns 0 if equal, 1 if value1 is bigger, -1 otherwise template int compare(const T &value1, const T &value2) { if (value1 < value2) return -1; if (value2 < value1) return 1; return 0; } int main(int argc, char **argv) { std::string h("hello"), w("world"); std::cout