C++ Standard Template Library CSE 333 Summer 2018

Slides:



Advertisements
Similar presentations
Brown Bag #2 Advanced C++. Topics  Templates  Standard Template Library (STL)  Pointers and Smart Pointers  Exceptions  Lambda Expressions  Tips.
Advertisements

Multimaps. Resources -- web For each new class, browse its methods These sites are richly linked, and contain indexes, examples, documents and other resources.
C++ Templates. What is a template? Templates are type-generic versions of functions and/or classes Template functions and template classes can be used.
C++ Sets and Multisets Set containers automatically sort their elements automatically. Multisets allow duplication of elements whereas sets do not. Usually,
C++ Programming: Program Design Including Data Structures, Second Edition Chapter 22: Standard Template Library (STL)
Basic C++ Sequential Container Features
CSE 332: C++ templates and generic programming I Motivation for Generic Programming in C++ We’ve looked at procedural programming –Reuse of code by packaging.
C++ / G4MICE Course Session 3 Introduction to Classes Pointers and References Makefiles Standard Template Library.
CSIS 123A Lecture 12 Templates. Introduction  C++ templates  Allow very ‘general’ definitions for functions and classes  Type names are ‘parameters’
Data Structures Using C++ 2E
Containers Overview and Class Vector
CNS  Sequences  vector,deque,list,(string),forward_list  Container Adapters  queue, stack, priority_queue  Associative Containers  set, unordered_set.
Comp 245 Data Structures Linked Lists. An Array Based List Usually is statically allocated; may not use memory efficiently Direct access to data; faster.
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 122 – Data Structures Standard Template Library (STL)
CSE 332: C++ STL containers Review: C++ Standard Template Library (STL) The STL is a collection of related software elements –Containers Data structures:
Standard Template Library The Standard Template Library was recently added to standard C++. –The STL contains generic template classes. –The STL permits.
 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.
CSE 232: C++ memory management Overview of Arrays Arrays are the simplest kind of data structure –One item right after another in memory (“contiguous range”
Lecture 7 : Intro. to STL (Standard Template Library)
STL CSSE 250 Susan Reeder. What is the STL? Standard Template Library Standard C++ Library is an extensible framework which contains components for Language.
Introduction The STL is a complex piece of software engineering that uses some of C++'s most sophisticated features STL provides an incredible amount.
C++ Review STL CONTAINERS.
CSE 332: C++ pointers, arrays, and references Overview of Pointers and References Often need to refer to another object –Without making a copy of the object.
CSE 332: C++ STL iterators What is an Iterator? An iterator must be able to do 2 main things –Point to the start of a range of elements (in a container)
Chapter 17 – Templates. Function Templates u Express general form for a function u Example: template for adding two numbers Lesson 17.1 template Type.
CSCI  Sequence Containers – store sequences of values ◦ vector ◦ deque ◦ list  Associative Containers – use “keys” to access data rather than.
Unit VI.  C++ templates are a powerful mechanism for code reuse, as they enable the programmer to write code (classes as well as functions) that behaves.
1 The Standard Template Library The STL is a collection of Container classes These are class templates for containers. A container is an object that stores.
Motivation for Generic Programming in C++
“Generic Programming” ECE 297
C++ Programming:. Program Design Including
Regarding homework 9 Many low grades
C++ Templates.
Motivation and Overview
Standard Template Library
Standard Template Library (STL)
Starting Out with C++ Early Objects Eighth Edition
Collections Intro What is the STL? Templates, collections, & iterators
What remains Topics Assignments Final exam
Prof. Michael Neary Lecture 7: The STL Prof. Michael Neary
C++ Templates L03 - Iterator 10 – Iterator.
10 – Iterators C++ Templates 4.6 The Iterator pgs
C++ Standard Template Library CSE 333 Spring 2018
ADT Implementations: Templates and Standard Containers
Chapter 2 Elementary Programming
CS212: Object Oriented Analysis and Design
CS212: Object Oriented Analysis and Design
C++ STL, Smart Pointers Intro CSE 333 Spring 2018
C++ Smart Pointers CSE 333 Spring 2018
The Standard Template Library
C++ Templates CSE 333 Summer 2018
C++ Constructor Insanity CSE 333 Summer 2018
C++ Standard Template Library CSE 333 Autumn 2018
C++ Standard Template Library CSE 333 Winter 2019
Data Structures & Algorithms
C++ Templates CSE 333 Autumn 2018
C++ Constructor Insanity CSE 333 Autumn 2018
Standard Template Library
C++ Constructor Insanity CSE 333 Winter 2019
Lesson 25 Miscellaneous Topics
C++ Templates CSE 333 Winter 2019
Collections Intro What is the STL? Templates, collections, & iterators
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.
C++ Standard Template Library CSE 333 Spring 2019
A dictionary lookup mechanism
Standard Template Library
Presentation transcript:

C++ Standard Template Library CSE 333 Summer 2018 Instructor: Hal Perkins Teaching Assistants: Renshu Gu William Kim Soumya Vasisht

C++’s Standard Library C++’s Standard Library consists of four major pieces: The entire C standard library C++’s input/output stream library std::cin, std::cout, stringstreams, fstreams, etc. C++’s standard template library (STL) ☜ Containers, iterators, algorithms (sort, find, etc.), numerics C+’+’s miscellaneous library Strings, exceptions, memory allocation, localization

STL Containers  A container is an object that stores (in memory) a collection of other objects (elements) Implemented as class templates, so hugely flexible More info in C++ Primer §9.2, 11.2 Several different classes of container Sequence containers (vector, deque, list, ...) Associative containers (set, map, multiset, multimap, bitset, ...) Differ in algorithmic cost and supported operations

STL Containers  STL containers store by value, not by reference When you insert an object, the container makes a copy If the container needs to rearrange objects, it makes copies e.g. if you sort a vector, it will make many, many copies e.g. if you insert into a map, that may trigger several copies What if you don’t want this (disabled copy constructor or copying is expensive)? You can insert a wrapper object with a pointer to the object We’ll learn about these “smart pointers” soon

Our Tracer Class Wrapper class for an unsigned int value_ 4/25/2018 Our Tracer Class Wrapper class for an unsigned int value_ Default ctor, cctor, dtor, op=, op< defined friend function operator<< defined Also holds unique unsigned int id_ (increasing from 0) Private helper method PrintID() to return "(id_,value_)" as a string Class and member definitions can be found in Tracer.h and Tracer.cc Useful for tracing behaviors of containers All methods print identifying messages Unique id_ allows you to follow individual instances

STL vector A generic, dynamically resizable array http://www.cplusplus.com/reference/stl/vector/vector/ Elements are store in contiguous memory locations Elements can be accessed using pointer arithmetic if you’d like to Random access is O(1) time Adding/removing from the end is cheap (amortized constant time) Inserting/deleting from the middle or start is expensive (linear time)

vector/Tracer Example 4/25/2018 vector/Tracer Example vectorfun.cc #include <iostream> #include <vector> #include "Tracer.h" using namespace std; int main(int argc, char** argv) { Tracer a, b, c; vector<Tracer> vec; cout << "vec.push_back " << a << endl; vec.push_back(a); cout << "vec.push_back " << b << endl; vec.push_back(b); cout << "vec.push_back " << c << endl; vec.push_back(c); cout << "vec[0]" << endl << vec[0] << endl; cout << "vec[2]" << endl << vec[2] << endl; return 0; }

STL iterator Each container class has an associated iterator class (e.g. vector<int>::iterator) used to iterate through elements of the container http://www.cplusplus.com/reference/std/iterator/ Iterator range is from begin up to end end is one past the last container element! Some container iterators support more operations than others All can be incremented (++), copied, copy-constructed Some can be dereferenced on RHS (e.g. x = *it;) Some can be dereferenced on LHS (e.g. *it = x;) Some can be decremented (--) Some support random access ([], +, -, +=, -=, <, > operators)

iterator Example vectoriterator.cc #include <vector> 4/25/2018 iterator Example vectoriterator.cc #include <vector> #include "Tracer.h" using namespace std; int main(int argc, char** argv) { Tracer a, b, c; vector<Tracer> vec; vec.push_back(a); vec.push_back(b); vec.push_back(c); cout << "Iterating:" << endl; vector<Tracer>::iterator it; for (it = vec.begin(); it < vec.end(); it++) { cout << *it << endl; } cout << "Done iterating!" << endl; return 0; Methods begin() and end() return begin and end iterators (which can be assigned and compared – at least equality). Getting container data is done by dereferencing iterator.

Type Inference (C++11) The auto keyword can be used to infer types 4/25/2018 Type Inference (C++11) The auto keyword can be used to infer types Simplifies your life if, for example, functions return complicated types The expression using auto must contain explicit initialization for it to work // Calculate and return a vector // containing all factors of n std::vector<int> Factors(int n); void foo(void) { // Manually identified type std::vector<int> facts1 = Factors(324234); // Inferred type auto facts2 = Factors(12321); // Compiler error here auto facts3; }

auto and Iterators Life becomes much simpler! for (vector<Tracer>::iterator it = vec.begin(); it < vec.end(); it++) { cout << *it << endl; } for (auto it = vec.begin(); it < vec.end(); it++) { cout << *it << endl; }

Range for Statement (C++11) Syntactic sugar similar to Java’s foreach General format: declaration defines loop variable expression is an object representing a sequence Strings, initializer lists, arrays with an explicit length defined, STL containers that support iterators for ( declaration : expression ) { statements } // Prints out a string, one // character per line std::string str("hello"); for ( auto c : str ) { std::cout << c << std::endl; }

Updated iterator Example 4/25/2018 Updated iterator Example vectoriterator_2011.cc #include <vector> #include "Tracer.h" using namespace std; int main(int argc, char** argv) { Tracer a, b, c; vector<Tracer> vec; vec.push_back(a); vec.push_back(b); vec.push_back(c); cout << "Iterating:" << endl; // "auto" is a C++11 feature not available on older compilers for (auto& p : vec) { cout << p << endl; } cout << "Done iterating!" << endl; return 0; in template, "class" is traditional, but may see "typename" instead

STL Algorithms A set of functions to be used on ranges of elements Range: any sequence that can be accessed through iterators or pointers, like arrays or some of the containers General form: Algorithms operate directly on range elements rather than the containers they live in Make use of elements’ copy ctor, =, ==, !=, < Some do not modify elements e.g. find, count, for_each, min_element, binary_search Some do modify elements e.g. sort, transform, copy, swap algorithm(begin, end, ...);

Algorithms Example vectoralgos.cc #include <vector> 4/25/2018 Algorithms Example vectoralgos.cc #include <vector> #include <algorithm> #include "Tracer.h" using namespace std; void PrintOut(const Tracer& p) { cout << " printout: " << p << endl; } int main(int argc, char** argv) { Tracer a, b, c; vector<Tracer> vec; vec.push_back(c); vec.push_back(a); vec.push_back(b); cout << "sort:" << endl; sort(vec.begin(), vec.end()); cout << "done sort!" << endl; for_each(vec.begin(), vec.end(), &PrintOut); return 0; Run vectoralgos to see Tracer output – lots of copying!!! http://www.cplusplus.com/reference/algorithm/sort/ -- “On average, linearithmic in the distance between first and last: Performs approximately N*log2(N) (where N is this distance) comparisons of elements, and up to that many element swaps (or moves).”

STL list A generic doubly-linked list http://www.cplusplus.com/reference/stl/list/ Elements are not stored in contiguous memory locations Does not support random access (e.g. cannot do list[5]) Some operations are much more efficient than vectors Constant time insertion, deletion anywhere in list Can iterate forward or backwards Has a built-in sort member function Doesn’t copy! Manipulates list structure instead of element values

list Example listexample.cc #include <list> 4/25/2018 list Example listexample.cc #include <list> #include <algorithm> #include "Tracer.h" using namespace std; void PrintOut(const Tracer& p) { cout << " printout: " << p << endl; } int main(int argc, char** argv) { Tracer a, b, c; list<Tracer> lst; lst.push_back(c); lst.push_back(a); lst.push_back(b); cout << "sort:" << endl; lst.sort(); cout << "done sort!" << endl; for_each(lst.begin(), lst.end(), &PrintOut); return 0;

STL map One of C++’s associative containers: a key/value table, implemented as a tree http://www.cplusplus.com/reference/stl/map/ General form: Keys must be unique multimap allows duplicate keys Efficient lookup (O(log n)) and insertion (O(log n)) Access value via name[key] Elements are type pair<key_type, value_type> and are stored in sorted order (key is field first, value is field second) Key type must support less-than operator (<) map<key_type, value_type> name;

map Example mapexample.cc 4/25/2018 map Example mapexample.cc void PrintOut(const pair<Tracer,Tracer>& p) { cout << "printout: [" << p.first << "," << p.second << "]" << endl; } int main(int argc, char** argv) { Tracer a, b, c, d, e, f; map<Tracer,Tracer> table; map<Tracer,Tracer>::iterator it; table.insert(pair<Tracer,Tracer>(a, b)); table[c] = d; table[e] = f; cout << "table[e]:" << table[e] << endl; it = table.find(c); cout << "PrintOut(*it), where it = table.find(c)" << endl; PrintOut(*it); cout << "iterating:" << endl; for_each(table.begin(), table.end(), &PrintOut); return 0; Run vectoralgos to see Tracer output – lots of copying!!!

Unordered Containers (C++11) unordered_map, unordered_set And related classes unordered_multimap, unordered_multiset Average case for key access is O(1) But range iterators can be less efficient than ordered map/set See C++ Primer, online references for details

Extra Exercise #1 Using the Tracer.h/.cc files from lecture: Construct a vector of lists of Tracers i.e. a vector container with each element being a list of Tracers Observe how many copies happen  Use the sort algorithm to sort the vector Use the list.sort() function to sort each list

Extra Exercise #2 Take one of the books from HW2’s test_tree and: Read in the book, split it into words (you can use your hw2) For each word, insert the word into an STL map The key is the word, the value is an integer The value should keep track of how many times you’ve seen the word, so each time you encounter the word, increment its map element Thus, build a histogram of word count Print out the histogram in order, sorted by word count Bonus: Plot the histogram on a log-log scale (use Excel, gnuplot, etc.) x-axis: log(word number), y-axis: log(word count)