Chapter 21 The STL (maps and algorithms) Bjarne Stroustrup www.stroustrup.com/Programming.

Slides:



Advertisements
Similar presentations
Chapter 10 Input/Output Streams
Advertisements

Chapter 17 vector and Free Store Bjarne Stroustrup
Chapter 16 Graphical User Interfaces
Chapter 3 Objects, types, and values Bjarne Stroustrup
Chapter 20 The STL (containers, iterators, and algorithms)
Chapter 8 Technicalities: Functions, etc. Bjarne Stroustrup
Chapter 19 Vectors, templates, and exceptions Bjarne Stroustrup
Chapter 7 Completing a Program
Chapter 14 Graph class design Bjarne Stroustrup
Chapter 4 Computation Bjarne Stroustrup
Chapter 18 Vectors and Arrays
Chapter 9 Technicalities: Classes, etc. Bjarne Stroustrup
Chapter 6 Writing a Program
Copyright © 2002 Pearson Education, Inc. Slide 1.
Chapter 19 Standard Template Library. Copyright © 2006 Pearson Addison-Wesley. All rights reserved Learning Objectives Iterators Constant and mutable.
Numeric Types & Ranges. ASCII Integral Type Numerical Inaccuracies Representational error – Round-off error – Caused by coding a real number as a finite.
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 8: Arrays Starting Out with C++ Early Objects Seventh Edition by.
Hold data and provide access to it. Random-access containers: -Allow accessing any element by index -arrays, vectors Sequential containers: -Allow accessing.
1 Joe Meehean. Ordered collection of items Not necessarily sorted 0-index (first item is item 0) Abstraction 2 Item 0 Item 1 Item 2 … Item N.
SEG4110 – Advanced Software Design and Reengineering TOPIC J C++ Standard Template Library.
CS 141 Computer Programming 1 1 Arrays. Outline  Introduction  Arrays  Declaring Arrays  Examples Using Arrays  Sorting Arrays  Multiple-Subscripted.
Chapter 20 The STL (containers, iterators, and algorithms) John Keyser’s Modifications of Slides by Bjarne Stroustrup
Chapter 16 Graphical User Interfaces John Keyser’s Modifications of Slides by Bjarne Stroustrup
Data Structures Using C++ 2E
Chapter 18 Vectors and Arrays John Keyser’s Modification of Slides by Bjarne Stroustrup
. STL: C++ Standard Library (continued). STL Iterators u Iterators are allow to traverse sequences u Methods  operator*  operator->  operator++, and.
Chapter 17 vector and Free Store John Keyser’s Modifications of Slides By Bjarne Stroustrup
CSE 332: C++ Algorithms I The C++ Algorithm Libraries A standard collection of generic algorithms –Applicable to various types and containers E.g., sorting.
Exceptions, Templates, And The Standard Template Library (STL) Chapter 16.
. The Standard C++ Library. 2 Main Ideas Purpose Flexibility Efficiency Simple & Uniform Interface.
Lecture 4 Sept 4 Goals: chapter 1 (completion) 1-d array examples Selection sorting Insertion sorting Max subsequence sum Algorithm analysis (Chapter 2)
Chapter 8. 2 Objectives You should be able to describe: One-Dimensional Arrays Array Initialization Arrays as Arguments Two-Dimensional Arrays Common.
1 Lecture 9  Arrays  Declaration  Initialization  Applications  Pointers  Declaration  The & and * operators  NULL pointer  Initialization  Readings:
C++ for Engineers and Scientists Third Edition
CSE 332: Combining STL features Combining STL Features STL has containers, iterators, algorithms, and functors –With several to many different varieties.
Lecture 23 Today Standard Template Library Programs in: programs/p19 Bibliography: Textbook p.252,
Chapter 7: Arrays. In this chapter, you will learn about: One-dimensional arrays Array initialization Declaring and processing two-dimensional arrays.
Data Structures Using C++ 2E
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 12: Recursion Problem Solving, Abstraction, and Design using C++
Containers Overview and Class Vector
Chapter 21 The STL (maps and algorithms) John Keyser’s Modifications of Slides by Bjarne Stroustrup
Chapter 21 The STL (maps and algorithms) Bjarne Stroustrup
Functional Programming Think Differently!! Functional languages are expressive, accomplishing tasks using short, succinct and readable code. Functional.
C++ for Engineers and Scientists Second Edition Chapter 11 Arrays.
Chapter 9: Part 2: Vectors + Maps and STL Overview JPC and JWD © 2002 McGraw-Hill, Inc. Modified by S. Sudarshan.
1 Iterators Good reference site:
Chapter 20 The STL (containers, iterators, and algorithms) Bjarne Stroustrup
 2003 Prentice Hall, Inc. All rights reserved.m ECE 2552 Dr. Këpuska based on Dr. S. Kozaitis Summer Chapter 15 - Class string and String Stream.
Ticket Booth Base Level 3 1. In the completed program, the ticket seller will: Select a venue from a menu of all venues. Select a show from a menu of.
A First Book of C++: From Here To There, Third Edition2 Objectives You should be able to describe: One-Dimensional Arrays Array Initialization Arrays.
Standard C++ Library Part II. Last Time b String abstraction b Containers - vector.
CHAPTER 10 ARRAYS AND FUNCTIONS Prepared by: Lec. Ghader Kurdi.
Intro to the C++ STL Timmie Smith September 6, 2001.
 2008 Pearson Education, Inc. All rights reserved. 1 Arrays and Vectors.
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Function Templates 16.2.
Objectives You should be able to describe: One-Dimensional Arrays
A FIRST BOOK OF C++ CHAPTER 7 ARRAYS. OBJECTIVES In this chapter, you will learn about: One-Dimensional Arrays Array Initialization Arrays as Arguments.
C++ Standard Library.
Standard Template Library (STL)
Chapter 21 The STL (maps and algorithms)
Partial Products Algorithm for Multiplication
Introduction to the Standard Template Library
Vectors.
Standard Template Library Find
Standard Template Library Model
Chapter 21 The STL (maps and algorithms)
the Standard Template Library
An Introduction to STL.
Some Definitions vector, string, deque, and list are standard sequence containers. set, multiset, map, multimap, unordered_set, unordered_multiset, unordered_map.
Presentation transcript:

Chapter 21 The STL (maps and algorithms) Bjarne Stroustrup

Abstract This talk presents the idea of STL algorithms and introduces map as an example of a container. This talk presents the idea of STL algorithms and introduces map as an example of a container. 2Stroustrup/Programming Nov'10

Overview Common tasks and ideals Common tasks and ideals Containers, algorithms, and iterators Containers, algorithms, and iterators The simplest algorithm: find() The simplest algorithm: find() Parameterization of algorithms Parameterization of algorithms find_if() and function objects find_if() and function objects Sequence containers Sequence containers vector and list vector and list Associative containers Associative containers map, set map, set Standard algorithms Standard algorithms copy, sort, … copy, sort, … Input iterators and output iterators Input iterators and output iterators List of useful facilities List of useful facilities Headers, algorithms, containers, function objects Headers, algorithms, containers, function objects 3Stroustrup/Programming Nov'10

Basic model A pair of iterators defines a sequence A pair of iterators defines a sequence The beginning (points to the first element – if any) The beginning (points to the first element – if any) The end (points to the one-beyond-the-last element) The end (points to the one-beyond-the-last element) 4 … begin:end: An iterator is a type that supports the iterator operations of An iterator is a type that supports the iterator operations of ++ Point to the next element ++ Point to the next element * Get the element * Get the element == Does this iterator point to the same element as that iterator? == Does this iterator point to the same element as that iterator? Some iterators support more operations (e.g., --, +, and [ ]) Some iterators support more operations (e.g., --, +, and [ ]) Stroustrup/Programming Nov'10

Accumulate (sum the elements of a sequence) template T accumulate(In first, In last, T init) { while (first!=last) { init = init + *first; ++first;} return init; } v: int sum = accumulate(v.begin(),v.end(),0); // sum becomes 10 Stroustrup/Programming Nov'10

Accumulate (sum the elements of a sequence) void f(vector & vd, int* p, int n) { double sum = accumulate(vd.begin(), vd.end(), 0.0); // add the elements of vd // note: the type of the 3 rd argument, the initializer, determines the precision used int si = accumulate(p, p+n, 0); // sum the ints in an int (danger of overflow) // p+n means (roughly) &p[n] long sl = accumulate(p, p+n, long(0));// sum the ints in a long double s2 = accumulate(p, p+n, 0.0);// sum the ints in a double // popular idiom, use the variable you want the result in as the initializer: double ss = 0; ss = accumulate(vd.begin(), vd.end(), ss); // do remember the assignment } 6Stroustrup/Programming Nov'10

Accumulate (generalize: process the elements of a sequence) // we dont need to use only +, we can use any binary operation (e.g., *) // any function that updates the init value can be used: template template T accumulate(In first, In last, T init, BinOp op) { while (first!=last) { init = op(init, *first);// means init op *first ++first;} return init; } 7Stroustrup/Programming Nov'10

Accumulate // often, we need multiplication rather than addition: #include #include void f(list & ld) { double product = accumulate(ld.begin(), ld.end(), 1.0, multiplies ()); // … } // multiplies is a standard library function object for multiplying 8 Note: multiplies for * Note: initializer 1.0 Stroustrup/Programming Nov'10

Accumulate (what if the data is part of a record?) struct Record { int units;// number of units sold double unit_price; // … }; // let the update the init value function extract data from a Record element: double price(double v, const Record& r) { return v + r.unit_price * r.units; } void f(const vector & vr, map & m) { double total = accumulate(vr.begin(), vr.end(), 0.0, price); // … } 9Stroustrup/Programming Nov'10

Inner product template template T inner_product(In first, In last, In2 first2, T init) // This is the way we multiply two vectors (yielding a scalar) { while(first!=last) { init = init + (*first) * (*first2); // multiply pairs of elements and sum init = init + (*first) * (*first2); // multiply pairs of elements and sum ++first; ++first; ++first2; ++first2;} return init; } * * * * … … number of units * unit price Stroustrup/Programming Nov'10

Inner product example // calculate the Dow Jones industrial index: vector dow_price;// share price for each company dow_price.push_back(81.86);dow_price.push_back(34.69);dow_price.push_back(54.45); // … vector dow_weight; // weight in index for each company dow_weight.push_back(5.8549); dow_weight.push_back (2.4808); dow_weight.push_back(3.8940); // … double dj_index = inner_product( // multiply (price,weight) pairs and add dow_price.begin(), dow_price.end(), dow_weight.begin(),0.0); 11Stroustrup/Programming Nov'10

Inner product (generalize!) // we can supply our own operations for combining element values withinit: template template T inner_product(In first, In last, In2 first2, T init, BinOp op, BinOp2 op2) { while(first!=last) { init = op(init, op2(*first, *first2)); ++first;++first2;} return init; } 12Stroustrup/Programming Nov'10

Map (an associative array) For a vector, you subscript using an integer For a vector, you subscript using an integer For a map, you can define the subscript to be (just about) any type For a map, you can define the subscript to be (just about) any type int main() { map words;// keep (word,frequency) pairs string s; while (cin>>s) ++words[s];// note: words is subscripted by a string // words[s] returns an int& // the int values are initialized to 0 typedef map ::const_iterator Iter; for (Iter p = words.begin(); p != words.end(); ++p) cout first second first second << "\n";} 13 Key type Value type Stroustrup/Programming Nov'10

An input for the words program (the abstract) This lecture and the next presents the STL (the containers and algorithms part of the C++ standard library). It is an extensible framework dealing with data in a C++ program. First, I present the general ideal, then the fundamental concepts, and finally examples of containers and algorithms. The key notions of sequence and iterator used to tie containers (data) together with algorithms (processing) are presented. Function objects are used to parameterize algorithms with policies. 14Stroustrup/Programming Nov'10

Output (word frequencies) (data): 1 (processing): 1 (the: 1 C++: 2 First,: 1 Function: 1 I: 1 It: 1 STL: 1 The: 1 This: 1 a: 1 algorithms: 3 algorithms.: 1 an: 1 and: 5 are: 2 concepts,: 1 containers: 3 data: 1 dealing: 1 examples: 1 extensible: 1 finally: 1 framework: 1 fundamental: 1 general: 1 ideal,: 1 in: 1 is: 1 iterator: 1 key: 1 lecture: 1 library).: 1 next: 1 notions: 1 objects: 1 of: 3 parameterize: 1 part: 1 present: 1 presented.: 1 presents: 1 program.: 1 sequence: 1 standard: 1 the: 5 then: 1 tie: 1 to: 2 together: 1 used: 2 with: 3 policies.: 1 15Stroustrup/Programming Nov'10

Map After vector, map is the most useful standard library container After vector, map is the most useful standard library container Maps (and/or hash tables) are the backbone of scripting languages Maps (and/or hash tables) are the backbone of scripting languages A map is really an ordered balanced binary tree A map is really an ordered balanced binary tree By default ordered by < (less than) By default ordered by < (less than) For example, map fruits; For example, map fruits; 16 Orange 99 Plum 8Kiwi 2345Apple 7 Quince 0Grape 100 fruits: Key first Value second Node* left Node* right … Map node: Stroustrup/Programming Nov'10

Map // note the similarity to vector and list template class map { // … typedef pair value_type;// a map deals in (Key,Value) pairs typedef ??? iterator;// probably a pointer to a tree node typedef ??? const_iterator; iterator begin();// points to first element iterator end();// points to one beyond the last element Value& operator[ ](const Key&); iterator find(const Key& k);// is there an entry for k? void erase(iterator p);// remove element pointed to by p pair insert(const value_type&); // insert a new pair before p // … }; 17 Some implementation defined type Stroustrup/Programming Nov'10

Map example (build some maps) map dow;// Dow Jones industrial index (symbol,price), 03/31/2004 // dow["MMM"] = 81.86; dow["AA"] = 34.69; dow["MO"] = 54.45; // … map dow_weight;// dow (symbol,weight) dow_weight.insert(make_pair("MMM", ));// just to show that a Map // really does hold pairs dow_weight.insert(make_pair("AA",2.4808)); dow_weight.insert(make_pair("MO",3.8940)); // and to show that notation matters // … map dow_name;// dow (symbol,name) dow_name["MMM"] = "3M Co."; dow_name["AA"] = "Alcoa Inc."; dow_name["MO"] = "Altria Group Inc."; // … 18Stroustrup/Programming Nov'10

Map example (some uses) double alcoa_price = dow["AAA"];// read values from a map double boeing_price = dow["BO"]; if (dow.find("INTC") != dow.end())// look in a map for an entry cout << "Intel is in the Dow\n"; // iterate through a map: typedef map ::const_iterator Dow_iterator; for (Dow_iterator p = dow.begin(); p!=dow.end(); ++p) { const string& symbol = p->first;// the "ticker" symbol cout second second << '\t' << dow_name[symbol] << '\n';} 19Stroustrup/Programming Nov'10

Map example (calculate the DJ index) double value_product( const pair & a, const pair & b)// extract values and multiply { return a.second * b.second; } double dj_index = inner_product(dow.begin(), dow.end(),// all companies in index dow_weight.begin(),// their weights 0.0,// initial value plus (),// add (as usual) value_product // extract values and weights ); // and multiply; then sum 20Stroustrup/Programming Nov'10

Containers and almost containers Sequence containers Sequence containers vector, list, deque vector, list, deque Associative containers Associative containers map, set, multimap, multiset map, set, multimap, multiset almost containers almost containers array, string, stack, queue, priority_queue array, string, stack, queue, priority_queue Soon-to-become standard containers Soon-to-become standard containers unordered_map (a hash table), unordered_set, … unordered_map (a hash table), unordered_set, … For anything non-trivial, consult documentation For anything non-trivial, consult documentation Online Online SGI, RogueWave, Dinkumware SGI, RogueWave, Dinkumware Other books Other books Stroustrup: The C++ Programming language (Chapters 16-19,22.6) Stroustrup: The C++ Programming language (Chapters 16-19,22.6) Austern: Generic Programming and the STL Austern: Generic Programming and the STL Josuttis: The C++ Standard Library Josuttis: The C++ Standard Library 21Stroustrup/Programming Nov'10

Algorithms An STL-style algorithm An STL-style algorithm Takes one or more sequences Takes one or more sequences Usually as pairs of iterators Usually as pairs of iterators Takes one or more operations Takes one or more operations Usually as function objects Usually as function objects Ordinary functions also work Ordinary functions also work Usually reports failure by returning the end of a sequence Usually reports failure by returning the end of a sequence 22Stroustrup/Programming Nov'10

Some useful standard algorithms r=find(b,e,v)r points to the first occurrence of v in [b,e) r=find(b,e,v)r points to the first occurrence of v in [b,e) r=find_if(b,e,p)r points to the first element x in [b,e) so that p(x) r=find_if(b,e,p)r points to the first element x in [b,e) so that p(x) x=count(b,e,v)x is the number of occurrences of v in [b,e) x=count(b,e,v)x is the number of occurrences of v in [b,e) x=count_if(b,e,p)x is the number of elements in [b,e) so that p(x) x=count_if(b,e,p)x is the number of elements in [b,e) so that p(x) sort(b,e)sort [b,e) using < sort(b,e)sort [b,e) using < sort(b,e,p)sort [b,e) using p sort(b,e,p)sort [b,e) using p copy(b,e,b2)copy [b,e) to [b2,b2+(e-b)) there had better be enough space after b2 copy(b,e,b2)copy [b,e) to [b2,b2+(e-b)) there had better be enough space after b2 unique_copy(b,e,b2)copy [b,e) to [b2,b2+(e-b)) but dont copy adjacent duplicates unique_copy(b,e,b2)copy [b,e) to [b2,b2+(e-b)) but dont copy adjacent duplicates merge(b,e,b2,e2,r)merge two sorted sequence [b2,e2) and [b,e) into [r,r+(e-b)+(e2-b2)) merge(b,e,b2,e2,r)merge two sorted sequence [b2,e2) and [b,e) into [r,r+(e-b)+(e2-b2)) r=equal_range(b,e,v)r is the subsequence of [b,e) with the value v (basically a binary search for v) r=equal_range(b,e,v)r is the subsequence of [b,e) with the value v (basically a binary search for v) equal(b,e,b2)does all elements of [b,e) and [b2,b2+(e-b)) compare equal? equal(b,e,b2)does all elements of [b,e) and [b2,b2+(e-b)) compare equal? 23Stroustrup/Programming Nov'10

Copy example template Out copy(In first, In last, Out res) { while (first!=last) *res++ = *first++; // conventional shorthand for: // *res = *first; ++res; ++first return res; } void f(vector & vd, list & li) { if (vd.size() < li.size()) error("target container too small"); copy(li.begin(), li.end(), vd.begin());// note: different container types // and different element types // (vd better have enough elements // to hold copies of lis elements) sort(vd.begin(), vd.end()); // … } 24Stroustrup/Programming Nov'10

Input and output iterators // we can provide iterators for output streams ostream_iterator oo(cout);// assigning to *oo is to write to cout *oo = "Hello, ";// meaning cout << "Hello, " ++oo;// get ready for next output operation *oo = "world!\n";// meaning cout << "world!\n" // we can provide iterators for input streams: istream_iterator ii(cin); // reading *ii is to read a string from cin string s1 = *ii;// meaning cin>>s1 ++ii;// get ready for the next input operation string s2 = *ii;// meaning cin>>s2 25Stroustrup/Programming Nov'10

Make a quick dictionary (using a vector) int main() { string from, to; string from, to; cin >> from >> to; // get source and target file names cin >> from >> to; // get source and target file names ifstream is(from.c_str()); // open input stream ifstream is(from.c_str()); // open input stream ofstream os(to.c_str());// open output stream ofstream os(to.c_str());// open output stream istream_iterator ii(is); // make input iterator for stream istream_iterator ii(is); // make input iterator for stream istream_iterator eos; // input sentinel (defaults to EOF) istream_iterator eos; // input sentinel (defaults to EOF) ostream_iterator oo(os,"\n");// make output iterator for stream ostream_iterator oo(os,"\n");// make output iterator for stream // append "\n" each time vector b(ii,eos);// b is a vector initialized from input vector b(ii,eos);// b is a vector initialized from input sort(b.begin(),b.end());// sort the buffer sort(b.begin(),b.end());// sort the buffer unique_copy(b.begin(),b.end(),oo); // copy buffer to output, unique_copy(b.begin(),b.end(),oo); // copy buffer to output, // discard replicated values // discard replicated values} 26Stroustrup/Programming Nov'10

An input file (the abstract) This lecture and the next presents the STL (the containers and algorithms part of the C++ standard library). It is an extensible framework dealing with data in a C++ program. First, I present the general ideal, then the fundamental concepts, and finally examples of containers and algorithms. The key notions of sequence and iterator used to tie containers (data) together with algorithms (processing) are presented. Function objects are used to parameterize algorithms with policies. 27Stroustrup/Programming Nov'10

Part of the output (data)(processing)(theC++First,FunctionIItSTLTheThisaalgorithmsalgorithms.anandareconcepts,containersdatadealingexamplesextensiblefinallyFrameworkfundamentalgeneralideal, inisiteratorkeylecturelibrary).nextnotionsobjectsofparameterizepartpresentpresented.presentsprogram.sequencestandardthethentietotogetherusedwithpolicies. 28Stroustrup/Programming Nov'10

Make a quick dictionary (using a vector) We are doing a lot of work that we dont really need We are doing a lot of work that we dont really need Why store all the duplicates? (in the vector) Why store all the duplicates? (in the vector) Why sort? Why sort? Why suppress all the duplicates on output? Why suppress all the duplicates on output? Why not just Why not just Put each word in the right place in a dictionary as we read it? Put each word in the right place in a dictionary as we read it? In other words: use a set In other words: use a set 29Stroustrup/Programming Nov'10

Make a quick dictionary (using a set) int main() { string from, to; string from, to; cin >> from >> to; // get source and target file names cin >> from >> to; // get source and target file names ifstream is(from.c_str()); // make input stream ifstream is(from.c_str()); // make input stream ofstream os(to.c_str());// make output stream ofstream os(to.c_str());// make output stream istream_iterator ii(is); // make input iterator for stream istream_iterator ii(is); // make input iterator for stream istream_iterator eos; // input sentinel (defaults to EOF) istream_iterator eos; // input sentinel (defaults to EOF) ostream_iterator oo(os,"\n");// make output iterator for stream ostream_iterator oo(os,"\n");// make output iterator for stream // append "\n" each time set b(ii,eos);// b is a set initialized from input set b(ii,eos);// b is a set initialized from input copy(b.begin(),b.end(),oo); // copy buffer to output copy(b.begin(),b.end(),oo); // copy buffer to output} // simple definition: a set is a map with no values, just keys 30Stroustrup/Programming Nov'10

Set A set is really an ordered balanced binary tree A set is really an ordered balanced binary tree By default ordered by < By default ordered by < For example, set fruits; For example, set fruits; 31 Orange PlumKiwiApple QuinceGrape fruits: Key first Node* left Node* right … set node: Stroustrup/Programming Nov'10

copy_if() // a very useful algorithm (missing from the standard library): template template Out copy_if(In first, In last, Out res, Pred p) // copy elements that fulfill the predicate { while (first!=last) { if (p(*first)) *res++ = *first; ++first;} return res; } 32Stroustrup/Programming Nov'10

copy_if() template struct Less_than { // typical predicate carrying data // this is what you cant do simply/elegantly with a function T val; Less_than(const T& v) :val(v) { } bool operator()(const T& v) const { return v < val; } }; void f(const vector & v)// typical use of predicate with data // copy all elements with a value less than 6 // copy all elements with a value less than 6{ vector v2(v.size()); copy_if(v.begin(), v.end(), v2.begin(), Less_than (6)); // … } 33Stroustrup/Programming Nov'10

Some standard function objects From From Binary Binary plus, minus, multiplies, divides, modulus plus, minus, multiplies, divides, modulus equal_to, not_equal_to, greater, less, greater_equal, less_equal, logical_and, logical_or equal_to, not_equal_to, greater, less, greater_equal, less_equal, logical_and, logical_or Unary Unary negate negate logical_not logical_not Unary (missing, write them yourself) Unary (missing, write them yourself) less_than, greater_than, less_than_or_equal, greater_than_or equal less_than, greater_than, less_than_or_equal, greater_than_or equal 34Stroustrup/Programming Nov'10