Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay...

31
IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer Science and Engineering IIT Bombay Session : Template Class “map” 1 Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay

Transcript of Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay...

Page 1: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Computer ProgrammingDr. Deepak B Phatak

Dr. Supratik ChakrabortyDepartment of Computer Science and Engineering

IIT Bombay

Session : Template Class “map”

1Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay

Page 2: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

• Object-oriented programming with structures and classes

• Template classes and functions• C++ Standard Library

• The “string” class

• The “vector” class

2 Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay

Quick Recap of Relevant Topics

Page 3: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

• The template class “map”

3 Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay

Overview of This Lecture

Page 4: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Acknowledgment

• Much of this lecture is motivated by the treatment in

An Introduction to Programming Through C++

by Abhiram G. Ranade

McGraw Hill Education 2014

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 4

Page 5: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

The “map” class

• For representing associative one-dimensional arrays/vectors• Arrays in which index is not necessarily an integer

• Indices are objects of specified types, e.g. string, V3, …

• Example usage: marks[“Shyam”], position[“BA207”]

• Notation: key (or index) and value

Key type and value type are completely independent

Key values must be ordered by (overloaded) < operator

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 5

Array of double valuesIndexed by strings

Array of V3 values (3-dimensional vectors)

Indexed by strings

Page 6: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

The “map” class

• For representing associative one-dimensional arrays/vectors• Template class : Can be instantiated with key type and value type

• Internally, elements stored as (key, value) pairs and sorted by key

• Internal representation: binary search tree

• Dynamic memory management built in

• “map” objects are container objects

• Must use #include <map> at start of program

• Large collection of member functions• We’ll see only a small subset

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 6

Page 7: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

The “pair” Template Class in Maps

• C++ Standard Library provides a template class

pair<T1, T2> with two data members named

first (of type T1) and second (of type T2)

• Every map<key_type, value_type> object is really a collection of (key, value) pairs stored as pair<key_type, value_type> objects

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 7

Page 8: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Simple Programming using “map”

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Give marks: “; cin >> stMarks; marks[stName] = stMarks; }

}

… Some other code …

}Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 8

Key type: stringValue type: double

Name of map

Page 9: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Simple Programming using “map”

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Give marks: “; cin >> stMarks; marks[stName] = stMarks; }

}

… Some other code …

}Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 9

Create an empty map of(string, double) pairs

Page 10: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Writing/Inserting “map” Elements

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 10

Accessing an elementindexed by string

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Give marks: “; cin >> stMarks; marks[stName] = stMarks; }

}

… Some other code …

}

Page 11: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Writing/Inserting “map” Elements

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 11

If (key, value) pair with key matching stName does not exist in marks, create a new

(stName, stMarks) pair and add to marks

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Give marks: “; cin >> stMarks; marks[stName] = stMarks; }

}

… Some other code …

}

Page 12: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Writing/Inserting “map” Elements

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 12

If (key, value) pair with key matching stName already exists in marks, update the

value of this pair to stMarks and erase the previous value

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Give marks: “; cin >> stMarks; marks[stName] = stMarks; }

}

… Some other code …

}

Page 13: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Over-writing “map” Elements

• What happens if we execute the following code ?

marks[stName] = stMarks;

marks[stName] = stMarks + 10;

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 13

Insert/update (key, value) pair

Update value in (key, value) pair

Page 14: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Reading “map” Elements

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 14

Accessing an elementindexed by string

Gives value associated with key stName

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

… Some other code …

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Marks of “ << stName << “ is: “ << marks[stName] << endl; }

}

return 0;}

Page 15: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Reading “map” Elements

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 15

What if stName is “Abdul” but no (key, value) pair with key

matching “Abdul” exists in marks?

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

… Some other code …

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Marks of “ << stName << “ is: “ << marks[stName] << endl; }

}

return 0;}

Page 16: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Reading “map” Elements

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 16

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

… Some other code …

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Marks of “ << stName << “ is: “ << marks[stName] << endl; }

}

return 0;}

A new (key, value) pair is created with key set to “Abdul” and value obtained from default

constructor of value type (here, double)

What if stName is “Abdul” but no (key, value) pair with key

matching “Abdul” exists in marks?

Page 17: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Reading “map” Elements

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 17

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

string stName; double stMarks;

… Some other code …

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { cout << “Marks of “ << stName << “ is: “ << marks[stName] << endl; }

}

return 0;}

A new (key, value) pair is created with key = “Abdul” and value = value returned by

default constructor of double

What if stName is “Abdul” but no (key, value) pair with key

matching “Abdul” exists in marks?

Garbage: value returned by default constructor of double

Page 18: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Accessing Elements using at

• Like vectors, we can use

marks.at(stName) instead of marks[stName]

If stName doesn’t match the key of any (key, value) pair in marks, an out_of_range exception is thrown

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 18

Page 19: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Comparing Key Values

• (key, value) pairs are stored sorted by key values

Requires a comparison operator for key values

Preferable: operator< defined for key type

map<string, double> marks;

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 19

operator< already defined in string class:Lexicographic (dictionary) order

“Abdul” < “Ajanta” < “Bobby”

Page 20: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Comparing Key Values

• (key, value) pairs are stored sorted by key values

Preferable: operator< defined for key type

What if operator< is not pre-defined for key type?

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 20

• Custom-define operator< function (operator overloading)bool operator<(key_type &a, key_type &b) { … }

Must ensure that < is transitive and anti-symmetric

a < b and b < c implies a < c a < b implies b < a

Page 21: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Comparing Key Values

• (key, value) pairs are stored sorted by key values

Preferable: operator< defined for key type

What if operator< is not pre-defined for key type?

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 21

• Custom-define operator< function (operator overloading)bool operator<(key_type &a, key_type &b) { … }

Must ensure that < is transitive and anti-symmetricMust ensure that every pair of distinct keys are ordered

a and b distinct implies either a < b or b < a

Page 22: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Comparing Key Values

• (key, value) pairs are stored sorted by key values

Preferable: operator< defined for key type

What if operator< is not pre-defined for key type?

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 22

• Custom-define operator< function (operator overloading)bool operator<(key_type &a, key_type &b) { … }

Must ensure that < is transitive and anti-symmetricMust ensure that every pair of distinct keys are ordered

• Custom-define separate comparison function and indicate in map declaration

Won’t cover in our discussions ….

Page 23: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Iterator Related Functions in “map” Class

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

marks[“Ajanta”] = 10.0; marks[“Bobby”] = 15.0; marks[“Abdul”] = 25.0;

map<string, double>::iterator it;

for (it = marks.begin(); it != marks.end(); it++) {

cout << it->first << “ : “ << it->second << endl;

}

return 0;

}

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 23

begin(), end() member functions

Abdul: 25.0Ajanta : 10.0Bobby : 15.0

Recall: elements of map are (key, value) pairs

Page 24: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Iterator Related Functions in “map” Class

#include <iostream>

#include <map>

using namespace std;

int main() {

map<string, double> marks;

marks[“Ajanta”] = 10.0; marks[“Bobby”] = 15.0; marks[“Abdul”] = 25.0;

map<string, double>::reverse_iterator rit;

for (rit = marks.rbegin(); rit != marks.rend(); rit++) {

cout << rit->first << “ : “ << rit->second << endl;

}

return 0;

}

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 24

rbegin(), rend() member functions

Bobby: 15.0Ajanta : 10.0Abdul: 25.0

Page 25: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Finding if an Element Exists in a Map

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 25

int main() {

map<string, double> marks; string stName;

… Some other code …

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { if (marks.count(stName) > 0) {cout << “Marks: “ << marks[stName] << endl;}

else { cout << “No student with name: “ << stName << endl;}

}

}

return 0;}

Page 26: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Finding if an Element Exists in a Map

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 26

int main() {

map<string, double> marks; string stName;

… Some other code …

while (true) {

cout << “Give name of student: “; cin >> stName;

if (stName == “end”) {cout << “Bye!!!” << endl; break;}

else { if (marks.count(stName) > 0) {cout << “Marks: “ << marks[stName] << endl;}

else { cout << “No student with name: “ << stName << endl;}

}

}

return 0;}

Counts number of pairs with key same as stName

Returns 1 if map contains an element with key stName, otherwise returns 0

Page 27: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Finding if an Element Exists in a Map

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 27

int main() {

map<string, double> marks;

… Other code …

map<string, double>::iterator it = marks.find(stName);

if (it != marks.end()) {cout << “Marks: “ << it->second << endl;}

else { cout << “No student with name: “ << stName << endl;}

return 0;

}

Returns an iterator to (key, value) pair with key matching stName

Page 28: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Finding the Count of Elements in a Map

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 28

int main() {

map<string, double> marks;

marks[“Ajanta”] = 10.0; marks[“Bobby”] = 15.0;

marks[“Abdul”] = 25.0;

cout << “Size : “ << marks.size() << endl;

marks[“Alex”] = 14.5; marks[“Ajanta”] = 11.0;

cout << “Size : “ << marks.size() << endl;

return 0;

}

Size : 3

Size : 4

Page 29: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Deleting Elements from a Map

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 29

int main() {map<string, double> marks;marks[“Ajanta”] = 10.0; marks[“Bobby”] = 15.0; marks[“Abdul”] = 25.0;map<string, double>::iterator it = marks.find(“Abdul”);marks.erase(it); marks.erase(“Bobby”);cout << “Size : “ << marks.size() << endl;for (it = marks.begin(); it != marks.end(); it++) {

cout << it->first << “ : “ << it->second << endl;}return 0;

}Ajanta : 10.0

Size : 1

Page 30: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Maps of Complex Data Types

• “map” is a template class

Can be instantiated to maps of complex data types

map<string, V3> flightPosition;

map<string, map<double, V3> > timedFlightPosition;

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 30

Note the space

Page 31: Computer Programming - CSE, IIT Bombaycs101/2014.2/lecture-slides/CS101x_S... · IIT Bombay Computer Programming Dr. Deepak B Phatak Dr. Supratik Chakraborty Department of Computer

IIT Bombay

Summary

• “map” class and its usage• Only some features studied

• Several more features exist …

Dr. Deepak B. Phatak & Dr. Supratik Chakraborty, IIT Bombay 31