Chapter 19 Vectors, templates, and exceptions Bjarne Stroustrup www.stroustrup.com/Programming.

Slides:



Advertisements
Similar presentations
Chapter 17 vector and Free Store Bjarne Stroustrup
Advertisements

Chapter 21 The STL (maps and algorithms) Bjarne Stroustrup
Chapter 8 Technicalities: Functions, etc. Bjarne Stroustrup
Chapter 14 Graph class design Bjarne Stroustrup
Chapter 25 Embedded systems programming Bjarne Stroustrup
Review for Final Exam Chapters 1–20 (Programming and C++ in 75 minutes) Bjarne Stroustrup Ronnie Ward 1Stroustrup/PPP -
Chapter 24 Numerics Bjarne Stroustrup
Chapter 18 Vectors and Arrays
Chapter 9 Technicalities: Classes, etc. Bjarne Stroustrup
Copyright © 2002 Pearson Education, Inc. Slide 1.
Copyright © 2003 Pearson Education, Inc. Slide 1.
Chapter 7 Constructors and Other Tools. Copyright © 2006 Pearson Addison-Wesley. All rights reserved. 7-2 Learning Objectives Constructors Definitions.
Chapter 10 Pointers and Dynamic Arrays. Copyright © 2006 Pearson Addison-Wesley. All rights reserved Learning Objectives Pointers Pointer variables.
Copyright © 2006 The McGraw-Hill Companies, Inc. Programming Languages 2nd edition Tucker and Noonan Chapter 11 Memory Management C makes it easy to shoot.
Etter/Ingber Arrays and Matrices. Etter/Ingber One-Dimensional Arrays 4 An array is an indexed data structure 4 All variables stored in an array are of.
DATA STRUCTURES USING C++ Chapter 5
CSE Lecture 12 – Linked Lists …
Chapter 20 The STL (containers, iterators, and algorithms) John Keyser’s Modifications of Slides by Bjarne Stroustrup
Dynamic Memory Allocation in C.  What is Memory What is Memory  Memory Allocation in C Memory Allocation in C  Difference b\w static memory allocation.
Object Oriented Programming Lect. Dr. Daniel POP Universitatea de Vest din Timişoara Facultatea de Matematică şi Informatică.
Chapter 18 Vectors and Arrays John Keyser’s Modification of Slides by Bjarne Stroustrup
Constructor. 2 constructor The main use of constructors is to initialize objects. A constructor is a special member function, whose name is same as class.
Chapter 17 vector and Free Store John Keyser’s Modifications of Slides By Bjarne Stroustrup
Chapter 9 Pointers and Dynamic Arrays. Overview 9.1 Pointers 9.2 Dynamic Arrays.
Dynamic Memory Allocation (also see pointers lectures) -L. Grewe.
Chapter 14 Graph class design John Keyser’s Modifications of Slides by Bjarne Stroustrup
C++ Programming Languages
Data Structure (Part I) Stacks and Queues. Introduction to Stack An stack is a ordered list in which insertion and deletions are made at one end. –The.
George Blank University Lecturer. CS 602 Java and the Web Object Oriented Software Development Using Java Chapter 4.
Chapter 10.
ISBN Chapter 11 Abstract Data Types and Encapsulation Concepts.
Slides prepared by Rose Williams, Binghamton University Chapter 5 Defining Classes II.
CSE 332: Combining STL features Combining STL Features STL has containers, iterators, algorithms, and functors –With several to many different varieties.
1 CISC181 Introduction to Computer Science Dr. McCoy Lecture 19 Clicker Questions November 3, 2009.
C++ Programming: Program Design Including Data Structures, Fourth Edition Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes.
C++ Programming: From Problem Analysis to Program Design, Fourth Edition Chapter 14: Pointers, Classes, Virtual Functions, and Abstract Classes.
Data Structures Using C++ 2E
Copyright © 2008 Pearson Addison-Wesley. All rights reserved. Chapter 13 Pointers and Linked Lists.
Lecture 11 vector and Free Store Bjarne Stroustrup
1 Chapter 3 Lists, Stacks, and Queues Abstract Data Types, Vectors Sections 3.1, 3.2, 3.3, 3.4 Abstract Data Types (ADT) Iterators Implementation of Vector.
1 CSC 222: Computer Programming II Spring 2004 Pointers and linked lists  human chain analogy  linked lists: adding/deleting/traversing nodes  Node.
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 17 vector and Free Store Hartmut Kaiser
Runtime Environments Compiler Construction Chapter 7.
Pointers OVERVIEW.
Chapter 19 Vectors, templates, and exceptions John Keyser’s Modifications of Slides By Bjarne Stroustrup
CSC 107 – Programming For Science. Today’s Goal  When lecture over, start understanding pointers  What a pointer is and what it is not  Why pointers.
Chapter 19 Vectors, templates, and exceptions Bjarne Stroustrup
Chapter 11: Pointers Copyright © 2008 W. W. Norton & Company. All rights reserved. 1 Chapter 11 Pointers.
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 19 Vectors, templates, and exceptions Hartmut Kaiser
Exceptions Bjarne Stroustrup
Computer Organization and Design Pointers, Arrays and Strings in C Montek Singh Sep 18, 2015 Lab 5 supplement.
Linked Lists based on the original work of Dr. Roger deBry Version 1.0
1 Chapter 3 Lists, Stacks, and Queues Reading: Sections 3.1, 3.2, 3.3, 3.4 Abstract Data Types (ADT) Iterators Implementation of Vector.
1 Introduction to Object Oriented Programming Chapter 10.
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.
PROGRAMMING 1 – HELPER INSTRUCTIONS ACKNOWLEDGEMENT: THE SLIDES ARE PREPARED FROM SLIDES PROVIDED BY NANCY M. AMATO AND JORY DENNY 1.
CS 31 Discussion, Week 7 Faisal Alquaddoomi, Office Hours: BH 2432, W 4:30-6:30pm, F 12:30-1:30pm.
CSCE Introduction to Program Design and Concepts Dr. J. Michael Moore Spring 2015 Set 18: Vectors, Templates and Exceptions 1.
Data Structures and Algorithm Analysis Dr. Ken Cosh Linked Lists.
Chapter 18 Vectors and Arrays Bjarne Stroustrup
Dynamic Allocation in C
Dynamic Storage Allocation
Chapter 18 Vectors and Arrays
Pointers and Linked Lists
Chapter 18 Vectors and Arrays
Array Lists Chapter 6 Section 6.1 to 6.3
Chapter 19 Vectors, templates, and exceptions
Chapter 17 vector and Free Store
Chapter 19 Vectors, templates, and exceptions
Stacks and Queues Prof. Michael Tsai 2017/02/21.
Presentation transcript:

Chapter 19 Vectors, templates, and exceptions Bjarne Stroustrup

Abstract This is the third of the lectures exploring the design of the standard library vector and the techniques and language features used to implement it. Here, we deal with changing the size of a vector, parameter-ization of a vector with an element type (templates), and range checking (exceptions). This is the third of the lectures exploring the design of the standard library vector and the techniques and language features used to implement it. Here, we deal with changing the size of a vector, parameter-ization of a vector with an element type (templates), and range checking (exceptions). 2Stroustrup/Programming Apr'10

Overview Vector revisited Vector revisited How are they implemented? How are they implemented? Pointers and free store Pointers and free store Destructors Destructors Copy constructor and copy assignment Copy constructor and copy assignment Arrays Arrays Array and pointer problems Array and pointer problems Changing size Changing size resize() and push_back() resize() and push_back() Templates Templates Range checking and exceptions Range checking and exceptions 3Stroustrup/Programming Apr'10

Changing vector size Fundamental problem addressed Fundamental problem addressed We (humans) want abstractions that can change size (e.g., a vector where we can change the number of elements). However, in computer memory everything must have a fixed size, so how do we create the illusion of change? We (humans) want abstractions that can change size (e.g., a vector where we can change the number of elements). However, in computer memory everything must have a fixed size, so how do we create the illusion of change? Given vector v(n);// v.size()==n Given vector v(n);// v.size()==n we can change its size in three ways Resize it Resize it v.resize(10);// v now has 10 elements v.resize(10);// v now has 10 elements Add an element Add an element v.push_back(7);// add an element with the value 7 to the end of v // v.size() increases by 1 v.push_back(7);// add an element with the value 7 to the end of v // v.size() increases by 1 Assign to it Assign to it v = v2;// v is now a copy of v2 // v.size() now equals v2.size() v = v2;// v is now a copy of v2 // v.size() now equals v2.size() 4Stroustrup/Programming Apr'10

Representing vector If you resize() or push_back() once, youll probably do it again; If you resize() or push_back() once, youll probably do it again; lets prepare for that by sometimes keeping a bit of free space for future expansion lets prepare for that by sometimes keeping a bit of free space for future expansion class vector { int sz; double* elem; int space;// number of elements plus free space // (the number of slots for new elements) public: // … }; 5 allocation:sz: elements (initialized) -----free space (uninitialized) 0 Stroustrup/Programming Apr'10

Representing vector An empty vector (no free store use): An empty vector (no free store use): A vector(N) (no free space): A vector(N) (no free space): 6 N:0 Stroustrup/Programming Apr'10

vector::reserve() First deal with space (allocation); given space all else is easy First deal with space (allocation); given space all else is easy Note: reserve() doesnt mess with size or element values Note: reserve() doesnt mess with size or element values void vector::reserve(int newalloc) // make the vector have space for newalloc elements { if (newalloc<=space) return;// never decrease allocation double* p = new double[newalloc];// allocate new space for (int i=0; i<sz; ++i) p[i]=elem[i];// copy old elements delete[ ] elem;// deallocate old space elem = p; space = newalloc; } 7Stroustrup/Programming Apr'10

vector::resize() Given reserve(), resize() is easy Given reserve(), resize() is easy reserve() deals with space/allocation reserve() deals with space/allocation resize() deals with element values resize() deals with element values void vector::resize(int newsize) // make the vector have newsize elements // initialize each new element with the default value 0.0 { reserve(newsize);// make sure we have sufficient space for(int i = sz; i<newsize; ++i) elem[i] = 0;// initialize new elements sz = newsize; } 8Stroustrup/Programming Apr'10

vector::push_back() Given reserve(), push_back() is easy Given reserve(), push_back() is easy reserve() deals with space/allocation reserve() deals with space/allocation push_back() just adds a value push_back() just adds a value void vector::push_back(double d) // increase vector size by one // initialize the new element with d { if (sz==0) // no space: grab some reserve(8); else if (sz==space) // no more free space: get more space reserve(2*space); elem[sz] = d;// add d at end ++sz;// and increase the size (sz is the number of elements) } 9Stroustrup/Programming Apr'10

resize() and push_back() class vector {// an almost real vector of doubles int sz;// the size double* elem;// a pointer to the elements int space;// size+free_space public: vector() : sz(0), elem(0), space(0) { }// default constructor explicit vector(int s) :sz(s), elem(new double[s]), space(s) { }// constructor vector(const vector&);// copy constructor vector& operator=(const vector&);// copy assignment ~vector() { delete[ ] elem; }// destructor double& operator[ ](int n) { return elem[n]; } // access: return reference int size() const { return sz; }// current size void resize(int newsize);// grow (or shrink) void push_back(double d);// add element void reserve(int newalloc);// get more space int capacity() const { return space; }// current available space }; 10Stroustrup/Programming Apr'10

The this pointer A vector is an object A vector is an object vector v(10); vector v(10); vector* p = &v;// we can point to a vector object vector* p = &v;// we can point to a vector object Sometimes, vectors member functions need to refer to that object Sometimes, vectors member functions need to refer to that object The name of that pointer to self in a member function is this The name of that pointer to self in a member function is this v: this: 10 p: Stroustrup/Programming Apr'10

The this pointer vector& vector::operator=(const vector& a) // like copy constructor, but we must deal with old elements { // … return *this;// by convention, // assignment returns a reference to its object: *this } void f(vector v1, vector v2, vector v3) { // … v1 = v2 = v3;// rare use made possible by operator=() returning *this // … } The this pointer has uses that are less obscure The this pointer has uses that are less obscure one of which well get to in two minutes one of which well get to in two minutes 12Stroustrup/Programming Apr'10

Assignment Copy and swap is a powerful general idea Copy and swap is a powerful general idea vector& vector::operator=(const vector& a) // like copy constructor, but we must deal with old elements // make a copy of a then replace the current sz and elem with as { double* p = new double[a.sz];// allocate new space for (int i = 0; i<a.sz; ++i) p[i] = a.elem[i];// copy elements delete[ ] elem;// deallocate old space sz = a.sz;// set new size elem = p;// set new elements return *this; // return a self-reference } 13Stroustrup/Programming Apr'10

Optimize assignment Copy and swap is the most general idea Copy and swap is the most general idea but not always the most efficient but not always the most efficient What if there already is sufficient space in the target vector? What if there already is sufficient space in the target vector? Then just copy! Then just copy! For example: a = b; For example: a = b; 14 sz: b: a: Stroustrup/Programming Apr'10

Optimized assignment vector& vector::operator=(const vector& a) { if (this==&a) return *this;// self-assignment, no work needed if (a.sz<=space) {// enough space, no need for new allocation for (int i = 0; i<a.sz; ++i) elem[i] = a.elem[i];// copy elements space += sz-a.sz;// increase free space sz = a.sz; return *this; } double* p = new double[a.sz];// copy and swap for (int i = 0; i<a.sz; ++i) p[i] = a.elem[i]; delete[ ] elem; sz = a.sz; space = a.sz; elem = p; return *this; } 15Stroustrup/Programming Apr'10

Templates But we dont just want vector of double But we dont just want vector of double We want vectors with element types we specify We want vectors with element types we specify vector vector vector // vector of pointers vector // vector of pointers vector >// vector of vectors vector >// vector of vectors vector vector We must make the element type a parameter to vector We must make the element type a parameter to vector vector must be able to take both built-in types and user- defined types as element types vector must be able to take both built-in types and user- defined types as element types This is not some magic reserved for the compiler, we can define our own parameterized types, called templates This is not some magic reserved for the compiler, we can define our own parameterized types, called templates 16Stroustrup/Programming Apr'10

Templates The basis for generic programming in C++ The basis for generic programming in C++ Sometimes called parametric polymorphism Sometimes called parametric polymorphism Parameterization of types (and functions) by types (and integers) Parameterization of types (and functions) by types (and integers) Unsurpassed flexibility and performance Unsurpassed flexibility and performance Used where performance is essential (e.g., hard real time and numerics) Used where performance is essential (e.g., hard real time and numerics) Used where flexibility is essential (e.g., the C++ standard library) Used where flexibility is essential (e.g., the C++ standard library) Template definitions Template definitions template class Buffer { /* … */ }; template void fill(Buffer & b) { /* … */ } Template specializations (instantiations) Template specializations (instantiations) // for a class template, you specify the template arguments: Buffer buf;// for buf, T is char and N is 1024 // for a function template, the compiler deduces the template arguments: fill(buf);// for fill(), T is char and N is 1024; thats what buf has 17Stroustrup/Programming Apr'10

Parameterize with element type // an almost real vector of Ts: template class vector { // … }; vector vd;// T is double vector vi;// T is int vector > vvi;// T is vector vector > vvi;// T is vector // in which T is int vector vc;// T is char vector vpd;// T is double* vector * > vvpd;// T is vector * // in which T is double 18Stroustrup/Programming Apr'10

Basically, vector is // an almost real vector of doubles: class vector { int sz;// the size double* elem;// a pointer to the elements int space;// size+free_space public: vector() : sz(0), elem(0), space(0) { }// default constructor explicit vector(int s) :sz(s), elem(new double[s]), space(s) { } // constructor vector(const vector&);// copy constructor vector& operator=(const vector&);// copy assignment ~vector() { delete[ ] elem; }// destructor double& operator[ ] (int n) { return elem[n]; }// access: return reference int size() const { return sz; }// the current size // … }; 19Stroustrup/Programming Apr'10

Basically, vector is // an almost real vector of chars: class vector { int sz;// the size char* elem;// a pointer to the elements int space;// size+free_space public: vector() : sz(0), elem(0), space(0) { }// default constructor explicit vector(int s) :sz(s), elem(new char[s]), space(s) { } // constructor vector(const vector&);// copy constructor vector& operator=(const vector&);// copy assignment ~vector() { delete[ ] elem; }// destructor char& operator[ ] (int n) { return elem[n]; }// access: return reference int size() const { return sz; }// the current size // … }; 20Stroustrup/Programming Apr'10

Basically, vector is // an almost real vector of Ts: template class vector {// read for all types T (just like in math) int sz;// the size T* elem;// a pointer to the elements int space;// size+free_space public: vector() : sz(0), elem(0), space(0);// default constructor explicit vector(int s) :sz(s), elem(new T[s]), space(s) { }// constructor vector(const vector&);// copy constructor vector& operator=(const vector&);// copy assignment ~vector() { delete[ ] elem; }// destructor T& operator[ ] (int n) { return elem[n]; } // access: return reference int size() const { return sz; }// the current size // … }; 21Stroustrup/Programming Apr'10

Templates Problems (theres no free lunch) Problems (theres no free lunch) Poor error diagnostics Poor error diagnostics Often spectacularly poor Often spectacularly poor Delayed error messages Delayed error messages Often at link time Often at link time All templates must be fully defined in each translation unit All templates must be fully defined in each translation unit (the facility for separate compilation of templates, called export, is not widely available) (the facility for separate compilation of templates, called export, is not widely available) So place template definitions in header files So place template definitions in header files Recommendation Recommendation Use template-based libraries Use template-based libraries Such as the C++ standard library Such as the C++ standard library E.g., vector, sort() E.g., vector, sort() Soon to be described in some detail Soon to be described in some detail Initially, write only very simple templates yourself Initially, write only very simple templates yourself Until you get more experience Until you get more experience 22Stroustrup/Programming Apr'10

Range checking // an almost real vector of Ts: struct out_of_range { /* … */ }; template class vector { // … T& operator[ ](int n);// access // … }; template T& vector ::operator[ ](int n) { if (n<0 || sz<=n) throw out_of_range(); return elem[n]; } 23Stroustrup/Programming Apr'10

Range checking void fill_vec(vector & v, int n)// initialize v with factorials { for (int i=0; i<n; ++i) v.push_back(factorial(i)); } int main() { vector v; try { fill_vec(v,10); for (int i=0; i<=v.size(); ++i) cout << "v[" << i << "]==" << v[i] << '\n'; } catch (out_of_range) {// well get here (why?) cout << "out of range error"; return 1; }} 24Stroustrup/Programming Apr'10

Exception handling (primitive) // sometimes we cannot do a complete cleanup vector * some_function()// make a filled vector { vector * p = new vector ;// we allocate on free store, // someone must deallocate try { fill_vec(*p,10); // … return p;// alls well; return the filled vector } catch (…) { delete p;// do our local cleanup throw;// re-throw to allow our caller to deal }} 25Stroustrup/Programming Apr'10

Exception handling (simpler and more structured) // When we use scoped variables cleanup is automatic vector glob; void some_other_function()// make a filled vector { vector v;// note: vector handles the deallocation of elements fill_vec(v,10); // use v fill_vec(glob,10); // … } if you feel that you need a try-block: think. if you feel that you need a try-block: think. You might be able to do without it You might be able to do without it 26Stroustrup/Programming Apr'10

RAII (Resource Acquisition Is Initialization) Vector Vector acquires memory for elements in its constructor acquires memory for elements in its constructor Manage it (changing size, controlling access, etc.) Manage it (changing size, controlling access, etc.) Gives back (releases) the memory in the destructor Gives back (releases) the memory in the destructor This is a special case of the general resource management strategy called RAII This is a special case of the general resource management strategy called RAII Also called scoped resource management Also called scoped resource management Use it wherever you can Use it wherever you can It is simpler and cheaper than anything else It is simpler and cheaper than anything else It interacts beautifully with error handling using exceptions It interacts beautifully with error handling using exceptions Examples of resources: Examples of resources: Memory, file handles, sockets, I/O connections (iostreams handle those using RAII), locks, widgets, threads. Memory, file handles, sockets, I/O connections (iostreams handle those using RAII), locks, widgets, threads. 27Stroustrup/Programming Apr'10

A confession The standard library vector doesnt guarantee range checking of [ ] The standard library vector doesnt guarantee range checking of [ ] You have been using You have been using Either our debug version, called Vector, which does check Either our debug version, called Vector, which does check Or a standard library version that does check (several do) Or a standard library version that does check (several do) Unless your version of the standard library checks, we cheated Unless your version of the standard library checks, we cheated In std_lib_facilities.h, we use the nasty trick (a macro substitution) of redefining vector to mean Vector In std_lib_facilities.h, we use the nasty trick (a macro substitution) of redefining vector to mean Vector #define vector Vector (This trick is nasty because what you see looking at the code is not what compiler sees – in real code macros are a significant source of obscure errors) (This trick is nasty because what you see looking at the code is not what compiler sees – in real code macros are a significant source of obscure errors) We did the same for string We did the same for string 28Stroustrup/Programming Apr'10

What the standard guarantees // the standard library vector doesnt guarantee a range check in operator[ ]: template class vector { // … T& at(int n);// checked access T& operator[ ](int n);// unchecked access }; template T& vector ::at (int n) { if (n<0 || sz<=n) throw out_of_range(); return elem[n]; } template T& vector ::operator[ ](int n) { return elem[n]; } 29Stroustrup/Programming Apr'10

What the standard guarantees Why doesnt the standard guarantee checking? Why doesnt the standard guarantee checking? Checking cost in speed and code size Checking cost in speed and code size Not much; dont worry Not much; dont worry No student project needs to worry No student project needs to worry Few real-world projects need to worry Few real-world projects need to worry Some projects need optimal performance Some projects need optimal performance Think huge (e.g., Google) and tiny (e.g., cell phone) Think huge (e.g., Google) and tiny (e.g., cell phone) The standard must serve everybody The standard must serve everybody You can build checked on top of optimal You can build checked on top of optimal You cant build optimal on top of checked You cant build optimal on top of checked Some projects are not allowed to use exceptions Some projects are not allowed to use exceptions Old projects with pre-exception parts Old projects with pre-exception parts High reliability, hard-real-time code (think airplanes) High reliability, hard-real-time code (think airplanes) 30Stroustrup/Programming Apr'10

Access to const vectors template class vector { // … T& at(int n);// checked access const T& at(int n) const;// checked access T& operator[ ](int n);// unchecked access const T& operator[ ](int n) const;// unchecked access // … }; void f(const vector cvd, vector vd) { // … double d1 = cvd[7];// call the const version of [ ] double d2 = vd[7];// call the non-const version of [ ] cvd[7] = 9;// error: call the const version of [ ] vd[7] = 9;// call the non-const version of [ ]: ok } 31Stroustrup/Programming Apr'10

String A string is rather similar to a vector A string is rather similar to a vector E.g. size(), [ ], push_back() E.g. size(), [ ], push_back() Built with the same language features and techniques Built with the same language features and techniques A string is optimized for character string manipulation A string is optimized for character string manipulation Concatenation (+) Concatenation (+) Can produce C-style string (c_str()) Can produce C-style string (c_str()) >> input terminated by whitespace >> input terminated by whitespace 32 6 Howyd! Stroustrup/Programming Apr'10 \0

Next lecture An introduction to the STL, the containers and algorithms part of the C++ standard library. Here well meet sequences, iterators, and containers (such as vector, list, and map). The algorithms include find(), find_if(), sort(), copy(), copy_if(), and accumulate(). An introduction to the STL, the containers and algorithms part of the C++ standard library. Here well meet sequences, iterators, and containers (such as vector, list, and map). The algorithms include find(), find_if(), sort(), copy(), copy_if(), and accumulate(). 33Stroustrup/Programming Apr'10