cplusplus_lecturenotes_module3

Upload: navediitr

Post on 08-Jan-2016

4 views

Category:

Documents


0 download

DESCRIPTION

module 3

TRANSCRIPT

  • C++ and OO

    l C++ classes and OO

    l More Examples

    l HW2

    C++ for C Programmers by Ira Pohl

  • Objects

    C++ for C Programmers by Ira Pohl

  • C++ and OO

    l What happens with a declaration l int i , j = 3; l Declares; allocates ; initializes l For a simple native type this happens

    automatically via a stack l Constructor the OO function to do this

    C++ for C Programmers by Ira Pohl

  • Quiz- what is printed l int main() l { int i = 9, j = 3; l cout
  • Answer

    l i is 9 j is 3

    l i is 5 j is 3

    l i is 9 j is 3

    C++ for C Programmers by Ira Pohl

  • Point and its constructor

    class point{ public: point(x=0.0, y = 0.0):x(x),y(y){} //constructor double getx(){return x;} void setx(double val){x = v;} .. private: double x, y; }; //note class_name():initializer list syntax

    C++ for C Programmers by Ira Pohl

  • This pointer --self-referential

    l Every class object has the implicit pointer l Keyword this associate with it.

    l We will use it in the next slide

    C++ for C Programmers by Ira Pohl

  • A special method -constructor

    l point(){ x = y = 0.0;}

    l or l point(){ this -> x = 0.0; this ->y = 0.0} l Or best l point():x(0.0),y(0.0){}

    l Default constructor the constructor whose signature is void.

    C++ for C Programmers by Ira Pohl

  • Use

    l point p, q, r; // all call constructor of void signature

    C++ for C Programmers by Ira Pohl

  • Constructor overloading

    l It is useful to have multiple ways to initialize an object like point.

    l point(double x, double y) l {this -> x = x; this ->y = y;}

    l this used to disambiguate

    C++ for C Programmers by Ira Pohl

  • Argument and member confusion

    l point(double x, double y) l {this -> x = x; this ->y = y;}

    l This lets ambiguity be resolved x=x; would not work l Better use initialization syntax l point(double x, double y):x(x),y(y){}

    C++ for C Programmers by Ira Pohl

  • More Constructors

    Constructors: Initialize Constructors: Convert Constructors: Allocate Also: constructors can check for correctness

    C++ for C Programmers by Ira Pohl

  • Memory management

    l new - allocator -think malloc() l delete deallocator think free()

    l Both work with a heap heap is dynamically allocated memory unlike Java not automatically garbage collected

    C++ for C Programmers by Ira Pohl

  • Simple use of new

    l char* s = new char[size];//get off heap l int *p = new int(9); // single int initialized l delete [] s; //delete an array l delete p; //delete single element

    l These will get used with dynamic data structures in constructors and destructors

    C++ for C Programmers by Ira Pohl

  • ~ destructor

    l Deallocator when item goes out of scope

    l Syntax within class ~classname(){ }

    l Typical use is for calling delete to deallocate to the heap what if you forget

    l Answer: Bad manners -memory leak

    C++ for C Programmers by Ira Pohl

  • Linked List p 168 section5.7

    l struct slistelem{ char data; slistelem* next;}

    l class slist{ //singly linked list l public: l slist():h(0){} //empty list l ~slist() {release();} destructor l ..more methods l private: l slistelem* h; //list head l }

    C++ for C Programmers by Ira Pohl

  • Prepend to slist

    l void slist::prepend (char* c) l { l slistelem* temp = new slistelem; l assert (temp != 0); l temp -> next = h; //single link l temp -> data = c; l h = temp; //update h l }

    C++ for C Programmers by Ira Pohl

  • ~ destructor

    l slist::~slist() l { l cout

  • HW2 some ideas

    l HW2 : implement Dijkstra algorithm and use a randomly generated graph to test it.

    l A simpler problem is to compute if a graph is one connected component

    l Draw Unconnected graph

    C++ for C Programmers by Ira Pohl

  • Unconnected graph

    l O

    l O O O

    l O O O

    C++ for C Programmers by Ira Pohl

  • Connected graph

    l O

    l O O O

    l O O O

    C++ for C Programmers by Ira Pohl

  • First draw a randomly generated Graph

    l bool** graph; l srand(time(0));//seed rand() l graph = new bool*[size]; l for(int i = 0; i

  • Density is 0.19 l for (int i = 0; i < size; ++i) l for(int j = i; j < size; ++j) l if (i == j) graph[i][j]= false; //no loops l else graph[i][j] = graph[j][i] = (prob() < 0.19);

    C++ for C Programmers by Ira Pohl

  • Quiz:

    l If the density is 0 the graph has no ____

    l If the density is 1 the graph is c..

    l If the density is fixed say 0.1 then as the size of the graph gets larger it is ____likely to be connected.

    C++ for C Programmers by Ira Pohl

  • Answer:

    l If the density is 0 the graph has no edges

    l If the density is 1 the graph is complete

    l If the density is fixed say 0.1 then as the size of the graph gets larger it is more likely to be connected.

    C++ for C Programmers by Ira Pohl

  • The is_connected algorithm

    l //This algorithm is a form of breadth first search - first implemented by the author in 1968 at SLAC.

    l //It was in PL1 and was a package of routines for computational graph theory.

    l //See also the Wikipedia on Breadth First Search.

    l //The algorithm is_connected uses a Boolean matrix representation of an undirected graph to determine if a graph is connected.

    C++ for C Programmers by Ira Pohl

  • Details

    l It starts with node 0 and determines which nodes can be reached from this node

    l placing them in an open set and placing node 0 as the first node of a connected component.

    l Each iteration adds one node to the closed set. l This stops with either no furter nodes reachable and

    is_connected is false or all nodes being included in the closed set.

    l The algorithm was published as a SLAC report and later a generalizion was published by Hopcroft and Tarjan in 1973.

    C++ for C Programmers by Ira Pohl

  • Is_connected l bool is_connected(bool *graph[], int size) l { l l int old_size =0, c_size = 0; l bool* close = new bool[size]; l bool* open = new bool[size]; l for(int i = 0; i < size; ++i) l open[i] = close[i] = false; l open[0] = true;

    C++ for C Programmers by Ira Pohl

  • At this point

    l Open set has node 0 on it l Question would this work if other node is

    selected

    l Nothing in closed set.

    l Each iteration will add one node to closed set

    C++ for C Programmers by Ira Pohl

  • Add to close l while(c_size < size){ l for (int i = 0; i < size; ++i){ l old_size = c_size; l if (open[i] && (close[i] == false)){ l close[i] = true; c_size++;

    C++ for C Programmers by Ira Pohl

  • Add to open

    l for(int j = 0; j < size; ++j) l open[j] = open[j] || graph[i][j]; l } l }

    C++ for C Programmers by Ira Pohl

  • Are we done? l We are done if have all nodes in close set l Or if no nodes available in open set

    if (c_size == size) return true; if (old_size == c_size) return false;

    } }

    C++ for C Programmers by Ira Pohl

  • L6 Lists

    l List and code

    C++ for C Programmers by Ira Pohl

  • List Element l struct list_element{

    list_element(int n = 0, list_element* ptr = 0): d(n), next(ptr){} int d; list_element* next; }; Or equivalently

    l class list_element{ public:

    l list_element(int n = 0, list_element* ptr = 0): d(n), next(ptr){} int d; list_element* next; };

    C++ for C Programmers by Ira Pohl

  • Quiz

    l In the previous list_element constructor, what is 0 used for?

    C++ for C Programmers by Ira Pohl

  • Ans: Null Pointer

    l The zero value is the null pointer value.

    l Recall it is important in lists to test for null; they are used as sentinel values.

    l C++11 - list_element* ptr =nullptr ; l new keyword - type safe

    C++ for C Programmers by Ira Pohl

  • List l class list{

    public: list():head(0), cursor(0){} void prepend(int n); //insert at front value n int get_element(){return cursor->d;} void advance(){ cursor= cursor-> next;} void print(); private: list_element* head; list_element* cursor; };

    C++ for C Programmers by Ira Pohl

  • prepend

    l void list::prepend(int n) { if (head == 0)//empty list case

    cursor = head = new list_element(n, head); else//add to front -chain

    head = new list_element(n, head); }

    C++ for C Programmers by Ira Pohl

  • Quiz : prepend(5)

    l Draw how prepend (5) would work.

    l Assume a two element list -> 7 -> 3 ##

    C++ for C Programmers by Ira Pohl

  • Answer

    l 5 is on the front of the new list

    l Draw here----

    C++ for C Programmers by Ira Pohl

  • Print() chaining l Void list:: print(){

    list_element* h = head; while(h != 0){//idiom for chaining cout d next; } cout

  • Use of list l int main()

    { list a, b; a.prepend(9); a.prepend(8); cout

  • Q: What gets printed

    l Follow previous code

    C++ for C Programmers by Ira Pohl

  • Ans:

    l Simulate here:(run)

    C++ for C Programmers by Ira Pohl

  • More elaborate l class list{

    public: list():head(0), cursor(0){} list(const int* arr, int n); list(const list& lst);//copy constructor

    l ... ~list(); //delete private: list_element* head; list_element* cursor; };

    l Deep copy v. referential copy

    C++ for C Programmers by Ira Pohl

  • Deep: Pi is transcendental

    C++ for C Programmers by Ira Pohl

  • Shallow: Moms pie is tasty

    C++ for C Programmers by Ira Pohl

  • Deep v. Shallow

    l First we will examine the copy constructor. We want to build an equivalent list that is a "deep" copy.

    l A "shallow copy would be a referential copy where

    the new list head would be the same value as the old list head.

    l Shallow copy is a highly efficient form of copying (why?) but has a more limited utility than a deep copy(why?).

    C++ for C Programmers by Ira Pohl

  • Copy constructor l

    list::list(const list& lst){ if (lst.head == 0) { head =0; cursor =0; } else set up

    l for( cursor = lst.head; cursor != 0; ) {

    chain and create } cursor = head;

    } }

    C++ for C Programmers by Ira Pohl

  • More code

    l else { cursor = lst.head; list_element* h = new list_element(); list_element* previous;

    head = h; h->d = lst.head->d;

    previous = h;

    C++ for C Programmers by Ira Pohl

  • Chain and create l for( cursor = lst.head; cursor != 0; )

    { h = new list_element(); h->d = cursor->d; previous->next = h; cursor = cursor->next; previous = h;

    } cursor = head;

    }

    C++ for C Programmers by Ira Pohl

  • ~ destructor l list::~list()

    { for( cursor = head; cursor != 0; ) {

    cursor = head->next; delete head; head = cursor;

    } } Here the destructor chains through the list returning each list_element created by a corresponding new.

    C++ for C Programmers by Ira Pohl

  • Use this list l int main()

    { list a, b; int data[10] = {3,4, 6, 7, -3, 5}; list d(data, 6); list e(data, 10); a.prepend(9); a.prepend(8); cout

  • l for (int i = 0; i < 40; ++i)

    b.prepend(i*i); cout

  • Dynamic data Structures in STL

    l The standard template library has the following data structures available and you are free to use them in your problem:

    l #include l can then use vector name(size); l vector is the most used it is nearly

    efficient as araw array and is safer and expandable.

    C++ for C Programmers by Ira Pohl

  • List is also available

    l #include l gets you doubly linked lists

    C++ for C Programmers by Ira Pohl

  • C++ More

    l HW2 Questions? l How to average in disconnected graphs l ignore them for averaging l Density is for entire set of edges does not mean node degree is

    uniform; also for small graphs a low density leads to graph being disconnected.

    l Review end of chapter short questions

    C++ for C Programmers by Ira Pohl