0% found this document useful (0 votes)
192 views22 pages

14-c - STL PDF

This document provides information about the C++ Standard Template Library (STL) course being taught in the summer of 2018. It lists the instructor and teaching assistants for the course. It then provides an overview of the C++ standard library, which includes the C standard library, input/output streams, the STL, and miscellaneous utilities. The rest of the document discusses key aspects of the STL, including containers like vector, iterators, and algorithms. Examples using the Tracer class are provided to demonstrate how to use vectors, iterators, and algorithms.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
192 views22 pages

14-c - STL PDF

This document provides information about the C++ Standard Template Library (STL) course being taught in the summer of 2018. It lists the instructor and teaching assistants for the course. It then provides an overview of the C++ standard library, which includes the C standard library, input/output streams, the STL, and miscellaneous utilities. The rest of the document discusses key aspects of the STL, including containers like vector, iterators, and algorithms. Examples using the Tracer class are provided to demonstrate how to use vectors, iterators, and algorithms.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 22

L14: C++ STL CSE333, Summer 2018

C++ Standard Template Library


CSE 333 Summer 2018

Instructor: Hal Perkins

Teaching Assistants:
Renshu Gu William Kim Soumya Vasisht
L14: C++ STL CSE333, Summer 2018

C++’s Standard Library


v C++’s Standard Library consists of four major pieces:
1) The entire C standard library
2) C++’s input/output stream library
• std::cin, std::cout, stringstreams, fstreams, etc.

3) C++’s standard template library (STL) ☜


• Containers, iterators, algorithms (sort, find, etc.), numerics

4) C+’+’s miscellaneous library


• Strings, exceptions, memory allocation, localization

2
L14: C++ STL CSE333, Summer 2018

STL Containers J
v 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

v Several different classes of container


§ Sequence containers (vector, deque, list, ...)
§ Associative containers (set, map, multiset, multimap,
bitset, ...)
§ Differ in algorithmic cost and supported operations

3
L14: C++ STL CSE333, Summer 2018

STL Containers L
v 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

4
L14: C++ STL CSE333, Summer 2018

Our Tracer Class


v 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

v Useful for tracing behaviors of containers


§ All methods print identifying messages
§ Unique id_ allows you to follow individual instances
5
L14: C++ STL CSE333, Summer 2018

STL vector
v 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)

6
L14: C++ STL CSE333, Summer 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;
}
7
L14: C++ STL CSE333, Summer 2018

STL iterator
v 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)
9
L14: C++ STL CSE333, Summer 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;
}
10
L14: C++ STL CSE333, Summer 2018

Type Inference (C++11)


v 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;
}
11
L14: C++ STL CSE333, Summer 2018

auto and Iterators


v 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;
}

12
L14: C++ STL CSE333, Summer 2018

Range for Statement (C++11)


v Syntactic sugar similar to Java’s foreach
§for
General format:
( declaration : expression ) {
statements
}

§ 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

// Prints out a string, one


// character per line
std::string str("hello");

for ( auto c : str ) {


std::cout << c << std::endl;
}
13
L14: C++ STL CSE333, Summer 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;
}
14
L14: C++ STL CSE333, Summer 2018

STL Algorithms
v 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: algorithm(begin, end, ...);

v 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
15
L14: C++ STL CSE333, Summer 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;
}
16
L14: C++ STL CSE333, Summer 2018

STL list
v 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

19
L14: C++ STL CSE333, Summer 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;
}
20
L14: C++ STL CSE333, Summer 2018

STL map
v One of C++’s associative containers: a key/value table,
implemented as a tree
§ http://www.cplusplus.com/reference/stl/map/
§ General form: map<key_type, value_type> name;
§ 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 (<)

21
L14: C++ STL CSE333, Summer 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;
}
22
L14: C++ STL CSE333, Summer 2018

Unordered Containers (C++11)


v 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

23
L14: C++ STL CSE333, Summer 2018

Extra Exercise #1
v 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 J
• Use the sort algorithm to sort the vector
• Use the list.sort() function to sort each list

24
L14: C++ STL CSE333, Summer 2018

Extra Exercise #2
v 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)

25

You might also like