Templates “Generic Programming” ECE 297. 2 Templates A way to write code once that works for many different types of variables –float, int, char, string,

Slides:



Advertisements
Similar presentations
Chapter6 LISTS AND STRINGS. Outline 1. List Specifications 2. List Implementations (a) Class Templates (b) Contiguous (c) Simply Linked (d) Simply Linked.
Advertisements

Copyright © 2014 Pearson Addison-Wesley. All rights reserved. Chapter 17 Templates.
Chapter 17 Templates. Generic Algorithms Algorithms in which the actions or steps are defined, but the data types of the items being manipulated are not.
C++ Templates. What is a template? Templates are type-generic versions of functions and/or classes Template functions and template classes can be used.
Exceptions, Templates, And The Standard Template Library (STL) Chapter 16.
Copyright © 2012 Pearson Education, Inc. Chapter 16: Exceptions, Templates, and the Standard Template Library (STL)
Lecture 3 Feb 4 summary of last week’s topics and review questions (handout) Today’s goals: Chapter 1 overview (sections 1.4 to 1.6) c++ classes constructors,
COMP 171 Data Structures and Algorithms Tutorial 1 Template and STL.
Chapter 16 Templates. Copyright © 2006 Pearson Addison-Wesley. All rights reserved Learning Objectives  Function Templates  Syntax, defining 
Review on pointers and dynamic objects. Memory Management  Static Memory Allocation  Memory is allocated at compiling time  Dynamic Memory  Memory.
Templates. Objectives At the conclusion of this lesson, students should be able to Explain how function templates are used Correctly create a function.
Standard Template Library C++ introduced both object-oriented ideas, as well as templates to C Templates are ways to write general code around objects.
Templates and the STL.
CSE 332: C++ Algorithms II From Last Time: Search with Generic Iterators Third generalization: separate iterator type parameter We arrive at the find algorithm.
CSIS 123A Lecture 12 Templates. Introduction  C++ templates  Allow very ‘general’ definitions for functions and classes  Type names are ‘parameters’
1 CISC181 Introduction to Computer Science Dr. McCoy Lecture 19 Clicker Questions November 3, 2009.
C++ C++ Overview (I) What is Object Orientated Programming? Approach: Break problem into subgroups of related parts that take into account code and data;
Sorting and Vectors Mechanism for representing lists JPC and JWD © 2002 McGraw-Hill, Inc. Modified by S. Sudarshan.
Modular Programming Chapter Value and Reference Parameters t Function declaration: void computesumave(float num1, float num2, float& sum, float&
Chapter 7: Arrays. In this chapter, you will learn about: One-dimensional arrays Array initialization Declaring and processing two-dimensional arrays.
Chapter 6 Vectors and arrays: Arrays: Run the following code. Anything unusual? #include using namespace std; #define N 10 #define M 11 int main() { int.
Data Structures Using C++ 2E
Modular Programming Chapter Value and Reference Parameters computeSumAve (x, y, sum, mean) ACTUALFORMAL xnum1(input) ynum2(input) sumsum(output)
Variables, Functions & Parameter Passing CSci 588 Fall 2013 All material not from online sources copyright © Travis Desell, 2011.
Introduction to STL and the vector container class CS342 Data Structures Based on Ford & Topp.
COP3530 Data Structures600 Stack Stack is one the most useful ADTs. Like list, it is a collection of data items. Supports “LIFO” (Last In First Out) discipline.
CSE 332: C++ Type Programming: Associated Types, Typedefs and Traits A General Look at Type Programming in C++ Associated types (the idea) –Let you associate.
224 3/30/98 CSE 143 Recursion [Sections 6.1, ]
Searching and Sorting, Template Functions, and Vectors ITK 169 Fall 2003.
Templates An introduction. Simple Template Functions template T max(T x, T y) { if (x > y) { return x; } else { return y; } } int main(void) { int x =
Pointers OVERVIEW.
STL multimap Container. STL multimaps multimaps are associative containers –Link a key to a value –AKA: Hashtables, Associative Arrays –A multimap allows.
Chapter 9: Part 2: Vectors + Maps and STL Overview JPC and JWD © 2002 McGraw-Hill, Inc. Modified by S. Sudarshan and A. Ranade.
Pointers and Dynamic Memory Allocation Copyright Kip Irvine 2003, all rights reserved. Revised 10/28/2003.
Chapter 9: Part 2: Vectors + Maps and STL Overview JPC and JWD © 2002 McGraw-Hill, Inc. Modified by S. Sudarshan.
Arrays and Vectors Sequential (One-Dimensional) Containers Chapter 12 1.
An Introduction to STL. The C++ Standard Template Libraries  In 1990, Alex Stepanov and Meng Lee of Hewlett Packard Laboratories extended C++ with a.
CPSC 252 The Big Three Page 1 The “Big Three” Every class that has data members pointing to dynamically allocated memory must implement these three methods:
Iterator for linked-list traversal, Template & STL COMP171 Fall 2005.
A gentle introduction to the standard template library (STL) Some references:
1 Today’s Objectives  Announcements Homework #3 is due on Monday, 10-Jul, however you can earn 10 bonus points for this HW if you turn it in on Wednesday,
Starting Out with C++, 3 rd Edition Introduction to the STL vector The Standard Template Library (or STL) is a collection of data types and algorithms.
CMSC 202 Lesson 6 Functions II. Warmup Correctly implement a swap function such that the following code will work: int a = 7; int b = 8; Swap(a, b); cout.
C:\Temp\Templates 4 5 Use This Main Program 6.
Chapter 7 Constructors and Other Tools Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
More STL Container Classes ECE Last Time Templates –Functions –Classes template void swap_val (VariableType &a, VariableType &b) { VariableType.
Lecture 7.  There are 2 types of libraries used by standard C++ The C standard library (math.h) and C++ The C++ standard template library  Allows us.
Std Library of C++ Part 2. vector vector is a collection of objects of a single type vector is a collection of objects of a single type Each object in.
Chapter 8 Writing Generic Functions. Objectives Understand the use of generic functions. Learn about the use of templates, their advantages and pitfalls.
Chapter 16 Templates Copyright © 2008 Pearson Addison-Wesley. All rights reserved.
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Function Templates 16.2.
“Generic Programming” ECE 297
CS 215 Final Review Ismail abumuhfouz Fall 2014.
Motivation and Overview
Vectors Holds a set of elements, like an array
C++ Standard Library.
Starting Out with C++ Early Objects Eighth Edition
Chapter 17 Templates. Chapter 17 Templates Overview 17.1 Templates for Algorithm Abstraction 17.2 Templates for Data Abstraction.
14 – Sequential Containers
CMSC 202 Lesson 22 Templates I.
The Standard Template Library
COP 3330 Object-oriented Programming in C++
Templates I CMSC 202.
C++ Templates An Introduction to Generic Programming.
Templates An introduction.
An Introduction to STL.
8.3 Vectors Copyright © 2008 Pearson Addison-Wesley. All rights reserved. 1.
14 – Sequential Containers
Presentation transcript:

Templates “Generic Programming” ECE 297

2 Templates A way to write code once that works for many different types of variables –float, int, char, string, List, Vector, … Reference: Problem Solving in C++ by Savitch, Chapter 17

Template Functions

4 Types & Functions All parameters and local variables in a function must have a type void swap_val (int &a, int &b) { int temp; temp = a; a = b; b = temp; } void swap_val (double &a, double &b) { double temp; temp = a; a = b; b = temp; } OK. Function overloading

5 Function Templates Allow you to write “abstract algorithms” –Work for many types template void swap_val (VariableType &a, VariableType &b) { VariableType temp; temp = a; a = b; b = temp; } “template prefix” defines a type parameter Can use that “type parameter” instead of a regular type In the function

6 Using a Function Template template void swap_val (VariableType &a, VariableType &b) { VariableType temp; temp = a; a = b; b = temp; } int main () { int i1 = 5, i2 = 10; swap_val (i1, i2); // Compiler will create swap_val float f1 = 1e6, f2 = 2e6; swap_val (f1, f2); // Compiler will create swap_val } Template definition must come before template use

7 Using a Function Template #include “swap_val.h” int main () { int i1 = 5, i2 = 10; swap_val (i1, i2); // swap_val created float f1 = 1e6, f2 = 2e6; swap_val (f1, f2); // swap_val created } template void swap_val (VariableType &a, VariableType &b) { VariableType temp; temp = a; a = b; b = temp; } main.cpp swap_val.h

8 Restrictions on Swap swap_val (int, int); swap_val (char, char); swap_val (List, List); swap_val (int, float); Works for any one type that has proper (deep copy) operator= template void swap_val (VariableType &a, VariableType &b) { VariableType temp; temp = a; a = b; b = temp; } 

9 Generic Minimum template VariableType minimum (VariableType a, VariableType b) { if (a < b) return (a); else return (b); } minimum (int, int); minimum (float, float); minimum (int[20], int[20]); minimum (List, List); minimum (string, string); Works for any type that defines operator< (reasonably)  

10 Generic Quicksort void QuickSort (int *A, int left, int right) { int PivotIndex = SelectAndShuffle (A, left, right); if (PivotIndex > left) // Basis QuickSort (A, left, PivotIndex-1); // Recursion if (PivotIndex < right) // Basis QuickSort (A, PivotIndex+1, right); // Recursion } template void QuickSort (Tbase *A, int left, int right) { int PivotIndex = SelectAndShuffle (A, left, right); if (PivotIndex > left) // Basis QuickSort (A, left, PivotIndex-1); // Recursion if (PivotIndex < right) // Basis QuickSort (A, PivotIndex+1, right); // Recursion }

11 Generic Quicksort int SelectAndShuffle (int *A, int left, int right) { int i, PivotIndex; PivotIndex = left; for (i = left+1 ; i <= right ; ++i) { if (A[i] <= A[left]) { PivotIndex = PivotIndex + 1; swap_val (A[i], A[PivotIndex]); } swap_val (A[left], A[PivotIndex]); return (PivotIndex); }

12 Generic Quicksort template int SelectAndShuffle (Tbase *A, int left, int right) { int i, PivotIndex; PivotIndex = left; for (i = left+1 ; i <= right ; ++i) { if (A[i] <= A[left]) { PivotIndex = PivotIndex + 1; swap_val (A[i], A[PivotIndex]); } swap_val (A[left], A[PivotIndex]); return (PivotIndex); }

Template Classes

14 Template Classes Can make templated (type-generic) classes –Member functions –Member data Most useful for container classes –Classes that implement basic data structures –List, Vector, Tree (Map), …

15 Example: Pair of Data Often useful to store two pieces of data together –key, value in ECE 244 lab5 (binary tree for DNS) used together –string name, int ip (244 lab 5) –Could want: string name, string data –or int key, float data –… Make a class that can store two arbitrary pieces of data –first (any type) –second (any type)

16 Generic Pair Class template class MyPair { public: MyPair (Tfirst _first, Tsecond _second); void setFirst (Tfirst _first); void setSecond (Tsecond _second); Tfirst getFirst (); Tsecond getSecond (); private: Tfirst first; Tsecond second; }; In MyPair.h

17 Generic Pair Class #include “MyPair.h” int main () { MyPair pair1(1, 2.5); cout << pair1.getFirst() << “ “ << pair1.getSecond();... int first = 1 float second = 2.5 pair1 In main.cpp Creates a variable named pair1 class (type) is MyPair

18 Generic Pair Class #include “MyPair.h” int main () { MyPair pair1(1, 2.5); cout << pair1.getFirst() << “ “ << pair1.getSecond(); MyPair tscore ("Your test score", 7.5); cout << tscore.getFirst() << " " << tscore.getSecond() << endl; tscore.setFirst ("Revised test score"); tscore.setSecond (9.5); cout << tscore.getFirst() << " " << tscore.getSecond() << endl; } string first = “Your test score” double second = 7.5 tscore In main.cpp Creates a variable named tscore class (type) is MyPair

19 Generic Pair Class #include “MyPair.h” int main () { MyPair pair1(1, 2.5); cout << pair1.getFirst() << “ “ << pair1.getSecond(); MyPair tscore ("Your test score", 7.5); cout << tscore.getFirst() << " " << tscore.getSecond() << endl; tscore.setFirst ("Revised test score"); tscore.setSecond (9.5); cout << tscore.getFirst() << " " << tscore.getSecond() << endl; } Your test score 7.5 Revised test score 9.5 Program output In main.cpp

20 Generic Pair Class template MyPair ::MyPair (Tfirst _first, Tsecond _second) { first = _first; second = _second; } template void MyPair ::setFirst (Tfirst _first) { first = _first; } … // Rest of member function defintitions In MyPair.h Template prefix: tells compiler this is a templated function Class name is MyPair

21 Function Definitions – Where? Usually bad style to define all member functions in header file But with templates, compiler must be able to generate class as it sees the specific type to build  Needs to see function definitions as it compiles class instantiations –E.g. MyPair in main.cpp –Need to generate instructions (.o) for MyPair, with a Tfirst = int, and Tsecond = float Easiest to achieve by putting whole class implementation in header file In MyPair.h template MyPair ::MyPair (Tfirst _first, Tsecond _second) { first = _first; second = _second; }... // Rest of class member function definitions #include “MyPair.h” int main () { MyPair pair1(1, 2.5); In main.cpp

22 Writing Templates Write code for a specific type first –Debug, test Convert to template –Can get complex / subtle syntax errors

STL: Generic Algorithms Using the Standard Template Libraries

24 STL Writing templates  fairly hard Using templates easy & productive Standard Template Library –Fast, well-tested implementations of useful algorithms and data structures

25 STL References Basic Reference: “Problem Solving in C++” by Savitch, Chapter 18 Detailed reference: cplusplus.comcplusplus.com Really nitty gritty details: “C++ Primer” by Lippman, Lajoie and Moo

26 STL Writing templates  fairly hard Using templates easy & productive Standard Template Library –Fast, well-tested implementations of useful algorithms and data structures

27 STL: Generic Algorithms #include using namespace std; int main ( ) { double x = 1.1, y = 1.2; double z = max (x, y); int j = 2, k = 3; int i = max (j, k); z = max (i, x); z = max (x, 2); z = max (x, 2.0); } main.cpp // Won’t compile // OK! max (double, double) Useful algorithms that work with many types in template T max (T a, T b) { if (a < b) return (b); else return (a); } // OK  max (int, int)

28 STL: Generic Algorithms Also in : min (), sort () Work for any one type that defines < and assignment (operator=) and lots more – see cplusplus.com But I only use the very basic ones

STL Container Classes

30 STL: Container Classes Most useful part of STL –Data structures that just “contain” some other data type / class –E.g. vector, linked list, binary tree of some type Can use to store any type of data (templated) –Avoids a lot of repetitive coding of linked lists, binary trees, etc.

31 Vector Example motivation: –Want to read integers from cin to an array until EOF > –Then pass the array on to the rest of the program to process, print, examine, … –Problem: how big an array should we allocate? int *array = new int[??]; –Don’t know until after the input is read! –Could code up a linked list, load it, count elements, then allocate array, copy data from linked list, delete linked list

32 Vector Wouldn’t it be great to have something just like an array that could grow as needed? #include using namespace std; vector get_input ( ) { vector vec; // vector of ints, initially empty int val; cin >> val; while ( !cin.fail() ) { vec.push_back (val); // Add new value to end of vector cin >> val; } return (vec); // Return the whole vector } main.cpp

33 Vector: Can Use Like Array #include using namespace std;... int main () { vector in_vals; in_vals = get_input (); for (int i = 0; i < in_vals.size(); i++) cout << in_vals[i] << “ “; cout << endl; for (int i = in_vals.size() – 1; i >= 0; i--) cout << in_vals[i] << “ “; } main.cpp vectors know how many elements they contain. Valid data from index 0 to size()-1 Fast, O(1), random access to any entry How would I print out the vector in reverse order? Input: Output:

34 Slightly Cleaner Version int main () { vector in_vals; in_vals = get_input (); for (int i = 0; i < in_vals.size(); i++) cout << in_vals[i] << “ “; } Compiler will give a type mismatch warning (.size() is unsigned int). Harmless, but I prefer to have no warnings. for (int i = 0; i < (int) in_vals.size(); i++) cout << in_vals[i] << “ “; Will make warning go away for (vector ::size_type i = 0; i < in_vals.size(); i++) cout << in_vals[i] << “ “; C++ purist’s way i now unsigned int  watch out for >= 0 tests

35 How Does It Work? Input: vector get_input ( ) { vector vec; // vector of ints, initially empty int val; cin >> val; while ( !cin.fail() ) { vec.push_back (val); // Add new value to end of vector cin >> val; } return (vec); // Return the whole vector } int *array int size int capacity vec

36 Vector: Key Properties Efficient to add elements at end (push_back) –Because when there isn’t enough space it grows the storage quite a bit (usually 2x) –Means even for a large number N of push_back(), we get only a few array copies –O(1) on average Efficient random access to data –Because internally the vector stores the data in an array  operator[ ] can be fast –O(1)

37 Handy Constructors #include using namespace std; int main () { vector vec1; // default constructor: size = 0 vector vec2(10); // size = 10, but values unknown vector vec3(10,-1); // size = 10, all values -1 }

38 Assignment & Destruction #include using namespace std; int main () { int *a = new int[10]; int *b = new int[10]; vector v1(10), v2(10); a[0] = 2; v1[0] = 2;... a = b; // OK? v1 = v2; // OK? delete[] a; delete[] b; delete v1; // Should I? } No! Shallow copy Yes! Proper deep copy defined in No! defines a destructor; cleans up its internal array

39 operator[] #include using namespace std; int main () { vector v1; v1.push_back(-3); v1[0] = -2; // OK? v1[1] = -2; // OK? v1.push_back(-3); v1[1] = -2; // OK? } Yes, entry 0 exists No, can’t create values with [ ] Yes, can create values with push_back() Yes, entry 1 exists now Really bad  out of bounds array access and memory corruption (maybe seg fault, maybe worse!) Most compilers have an option to make vector check the [ ] index value is between 0 and size()-1 and print an error (g++ -D_GLIBCXX_DEBUG) Slows program down  we have turned this on only for the debug configuration of your milestone1 NetBeans project

40 Shrinking a vector #include using namespace std; int main () { vector v1; v1.push_back(1); v1.push_back(2); for (int i = 0; i < in_vals.size(); i++) cout << in_vals[i] << “ “; v1.pop_back(); // Removes one entry from end of vector for (int i = 0; i < in_vals.size(); i++) cout << in_vals[i] << “ “; } Output: 1 2 Output: 1

41 Vectors should be familiar vector almost same as –Difference: string defines some extra utility functions –Otherwise a string really is a vector Full reference on vector member functions at