Lecture 4

advertisement
Data Structures Using C++ 2E
Chapter 4
Standard Template Library (STL) I
Objectives
• Learn about the Standard Template Library (STL)
• Become familiar with the three basic components of
the STL: containers, iterators, and algorithms (in
Chapter 13)
• Explore how vector and deque containers are
used to manipulate data in a program
• Discover the use of iterators
Data Structures Using C++ 2E
2
Different C++/STL versions
• C++11 is the ISO C++ standard ratified in 2011. The
previous standard is often referred to as
C++98/C++03; the differences between C++98 and
C++03 are very few.
• The list of STL classes in both C++ and C++98 can
be found under
http://www.cplusplus.com/reference/stl/
• This materials of this textbook is based on C++ 98
Data Structures Using C++ 2E
3
Components of the STL
• Program’s main objective is to manipulate data and
generate results
– Requires ability to store data, access data, and
manipulate data
• STL components
– Containers
– Iterators: step through container elements
– Algorithms: manipulate data (e.g. sorting, search)
• Containers and iterators
– Class templates (types as class arguments)
Data Structures Using C++ 2E
4
Container Types
• STL containers categories
– Sequence containers (sequential containers)
– Associative containers
– Container adapters
Data Structures Using C++ 2E
5
Container Types
• STL containers categories
– Sequence containers (sequential containers)
• vector, deque, list…
– Associative containers
• set, map, multiset, multimap…
– Container adapters: adaptation of sequence or
associative class containers by modifying and
restricting its interface for some special purpose.
• stack (LIFO), queue (FIFO), priority_queue…
Data Structures Using C++ 2E
6
Containers, Associated Header Files,
and Iterator Support
7
STL containers
From http://cs.brown.edu/~jak/proglang/cpp/stltut/tut.html
8
STL: Sequence containers
• Contiguous blocks of objects; elements can be
inserted at any point in the sequence; sequences are
indexed by integers
• Vector
– Fast insertion at end, and allow random access.
• List
– Fast insertion anywhere, but provide only sequential
access.
• Deque
– Fast insertion at either end, and allow random access.
Data Structures Using C++ 2E
9
STL: Associative containers
• Associative containers are a generalization of
sequences; can be indexed by any type (e.g., an ID or
a name)
• Implemented with a data structure called binary
search tree, which will be covered later in this course.
Data Structures Using C++ 2E
10
STL: Associative containers
• Sets: add, delete, search, and iterate through the set.
• Multisets: Multisets are just like sets, except that
duplicate copies of the same element are allowed.
• Maps: Maps represent a mapping from one type
(the key type) to another type (the value type). You can
associate a value with a key, or find the value
associated with a key, very efficiently; you can also
iterate through all the keys.
• Multimaps: are just like maps except that there is no
limit on elemenets with the same key.
Data Structures Using C++ 2E
11
Sequence Containers
• Every object has a specific position
• Predefined sequence containers
– vector , deque , list
• Sequence container vector
– Logically: same as arrays
– Processed like arrays
• All containers
– Use same names (e.g. push_back()) for common
operations
– May have specific operations
Data Structures Using C++ 2E
12
Arrays
• Static arrays
int foo[100];
• Dynamic arrays
Data Structures Using C++ 2E
13
Sequence Container: vector
• Vector container
–
–
–
–
Stores, manages objects in a dynamic array
Elements accessed randomly
Time-consuming item insertion: middle, beginning
Fast item insertion: end
• Class implementing vector container
– vector
Data Structures Using C++ 2E
14
Sequence Container: vector (cont’d.)
• Using a vector container in a program requires the
following statement:
– #include <vector>
• Defining a vector container object
– Specify object type
– Example: vector<int> intlist;
– Example: vector<string> stringList;
Data Structures Using C++ 2E
15
Sequence Container: vector (cont’d.)
• Declaring vector objects
TABLE 4-1 Various ways to declare and initialize a vector container
16
Declare and initialize a vector
Data Structures Using C++ 2E
17
Sequence Container: vector (cont’d.)
• Manipulating data stored in a vector sequence
container
– Basic operations
• Item insertion
• Item deletion
• Stepping through the elements of a vector array
Data Structures Using C++ 2E
18
Sequence Container: vector (cont’d.)
Difference: .at (index) checks if index is out of
bound, while [index] doesn’t.
Data Structures Using C++ 2E
19
Access a vector
Data Structures Using C++ 2E
20
vector: size vs. capacity
• Size: the number of elements you have used.
• Capacity: allocated space. In STL, it’s doubled
each time if additional space is needed.
• “double the size” is out of
a careful design.
Data Structures Using C++ 2E
21
Sequence Container: vector (cont’d.)
• Function push_back
– Adds element to end of container
– Used when declaring vector container
• Specific size unknown
Data Structures Using C++ 2E
22
Sequence Container: vector (cont’d.)
• class vector provides various operations to
process vector container elements
• Iterator
– The argument position in STL terminology
Data Structures Using C++ 2E
23
Iterators
• Iterators provide a way of specifying a position in a
container.
• The code
vector<int> v;
// add some integers to v
vector::iterator i1 = v.begin();
vector::iterator i2 = v.end();
will create two iterators like this:
Note: v.end() actually returns
the past-the-end position
Data Structures Using C++ 2E
24
Declaring an Iterator to a Vector
Container
• Even though we can process vector like an array
using array [ ] operator, sometimes we need to
process vector elements based on their positions.
• class vector: function insert
– Insert element at a specific vector container position
– Uses an iterator
• class vector: function erase
– Remove element
• Uses an iterator
Data Structures Using C++ 2E
25
Declaring an Iterator to a Vector
Container (cont’d.)
• class vector contains iterator (a typedef
inside the class vector), declared as a public
member of vector
– https://www.sgi.com/tech/stl/stl_vector.h
• typedef value_type* iterator;
(nothing but a pointer!)
– If you want to declare a vector iterator, you’d need to
use the scope resolution operator :: to specify which
type of vector the iterator belongs to.
– Example
vector<int>::iterator intVecIter;
Data Structures Using C++ 2E
26
Declaring an Iterator to a Vector
Container (cont’d.)
vector<int>::iterator intVecIter;
– Container name (vector)
– Container data type (int)
– Scope resolution operator (::)
• ++intVecIter
– Advances iterator intVecIter to next element into
the container
• *intVecIter
– Returns element at current iterator position
Data Structures Using C++ 2E
27
Manipulation we can do with iteartors
• Using an iterator into a vector container
– Manipulating element type to be int
Data Structures Using C++ 2E
28
Containers and the Functions begin
and end
• begin()
– Returns position of the first element into the container
• end()
– Returns position of (past) the last element into the
container
• Functions have no parameters
Data Structures Using C++ 2E
29
Example 4-4
Data Structures Using C++ 2E
30
Sequence Container: vector (cont’d.)
TABLE 4-3 Various operations on a vector container
Data Structures Using C++ 2E
31
Vector: other functions
TABLE 4-3 Various operations on a vector container (cont’d.)
Data Structures Using C++ 2E
32
Containers and the Functions begin
and end (cont’d.)
TABLE 4-4 Functions to determine the size of a vector container
Data Structures Using C++ 2E
33
More examples of STL vector
• http://www.cplusplus.com/reference/stl/
• http://www.cplusplus.com/reference/vector/vector/
• https://www.sgi.com/tech/stl/Vector.html
Data Structures Using C++ 2E
34
Member Functions Common to All
Containers
• Constructors & destructor
– Default constructor, Several constructors with
parameters,
– Copy constructor,
– Destructor
• Container operations:
– insert(), erase(), begin(), end(), etc…
• Containers operations:
• Assignment
• Comparison: equal to or not, >, < ,…
– Lexicographic order, for the entire container.
35
TABLE 4-5 Member functions common to all containers
Data Structures Using C++ 2E
36
37
Member Functions Common to
Sequence Containers
TABLE 4-6 Member functions common to all sequence containers
Data Structures Using C++ 2E
38
The copy Algorithm
• Provides convenient way to output container
elements
• Generic STL algorithm
– Usable with any container type and arrays
• Does more than output container elements
– Allows copying of elements from one place to another
• Function template copy definition
– Contained in header file algorithm
Data Structures Using C++ 2E
39
copy examples
40
Sequence Container: deque
• Deque: double-ended queue
• Implemented as dynamic arrays
– Can expand in either direction
• Class name defining deque container
– deque
• Header file deque contains
– Definition of the class deque
– Functions to implement various operations on a
deque object
• Class deque contains several constructors
Data Structures Using C++ 2E
41
Sequence Container: deque (cont’d.)
TABLE 4-7 Various ways to declare a deque object
Data Structures Using C++ 2E
42
Sequence Container: deque (cont’d.)
TABLE 4-8 Various operations that can be performed
on a deque object
Data Structures Using C++ 2E
43
More examples about STL deque
• http://www.cplusplus.com/reference/deque/deque/
• https://www.sgi.com/tech/stl/Deque.html
Data Structures Using C++ 2E
44
STL: Iterators in general
• Work like pointers
• Point to elements of a container (sequence or
associative)
• Allow successive access to each container element
• Two most common operations on iterators
– ++ (increment operator)
– * (dereferencing operator)
• Examples
++cntItr;
*cntItr;
Data Structures Using C++ 2E
45
Types of Iterators
•
•
•
•
•
Input iterators
Output iterators
Forward iterators
Bidirectional iterators
Random access iterators
Data Structures Using C++ 2E
46
Operations supported by the iterators
Read access; step forward
int t = *inputIter;
++inputIter;
write access; step forward
*outputIter = t;
++outputIter;
Both read/write;
step forward
Both read/write;
step forward and
backward.
Supported in list,
set, map, multiset,
multimap
Both read/write; jump
forward and backward.
rIterator = rIterator + n;
Supported in vector
deque, string, array
47
Iterators (cont’d.)
• typedef iterator
– Every container (sequence or associative) contains a
typedef iterator
– Iterator into a container declared using typedef
iterator. For example
– Must use appropriate container name, container
element type, scope resolution operator
Data Structures Using C++ 2E
58
Iterators (cont’d.)
• typedef const_iterator
– Modify container elements using an iterator into a
container and dereferencing operator (*)
– Prevents iterator from modifying elements of
container declared as constant
– Every container contains typedef
const_iterator
– Read-only iterator
Data Structures Using C++ 2E
59
Iterators (cont’d.)
• typedef reverse_iterator
– Every container contains typedef
reverse_iterator
– Used to iterate through the elements of a container in
reverse
Data Structures Using C++ 2E
60
Iterators (cont’d.)
• typedef const_reverse iterator
– Read-only iterator
– Used to iterate through elements of a container in
reverse
– Required if
• Container declared as const
• Need to iterate through the elements of the container in
reverse
Data Structures Using C++ 2E
61
Summary
• STL
– Provides class templates
• Process lists, stacks, and queues
– Three main components
• Containers, iterators, and algorithms
– STL containers: class templates
• Iterators
– Step through the elements of a container
• Algorithms
– Manipulate elements in a container
Data Structures Using C++ 2E
62
Summary (cont’d.)
• Main categories of containers
– Sequence containers, associative containers,
container adapters
• Three predefined sequence containers
– vector, deque, and list
• copy algorithm
– Copies elements in a given range to another place
• Five categories of iterators: input, output, forward,
bidirectional, random access iterator
Data Structures Using C++ 2E
63
Download