Chapter 22 STL Containers §22.1 STL Basics §22.2 STL Iterators §22.3 Sequence Containers §22.4...

30
Chapter 22 STL Containers §22.1 STL Basics §22.2 STL Iterators §22.3 Sequence Containers §22.4 Associative Containers §22.5 Container Adapters

Transcript of Chapter 22 STL Containers §22.1 STL Basics §22.2 STL Iterators §22.3 Sequence Containers §22.4...

Chapter 22 STL Containers

§22.1 STL Basics§22.2 STL Iterators§22.3 Sequence Containers§22.4 Associative Containers§22.5 Container Adapters

§22.1 STL Basics

Standard Template Library (STL) 标准模板库 A software library included in the C++ Standard Library

Purpose To standardize commonly used components

History Originally developed by Alexander Stepanov in 1980s Accepted as part of C++ standard in Feb. 1994

2

Three Components of STL

Containers(容器) A container object, such as vector, used to store a

collection of data, often referred to as elements Iterators(迭代器)

Objects that facilitate traversing through the elements in a container

Like built-in pointers that provide a convenient way to access and manipulate the elements in a container

Algorithms(算法) Functions to manipulate data such as sorting,

searching, and comparing elements. Most of them use iterators to access the elements in

the container.

3

Three Types of Containers

Sequence/sequential containers, 序列容器 Represent linear data structures Three sequence containers

vector 向量 , list 表 , and deque 双端队列 Associative containers,关联容器 /联合容器

Non-linear containers that can locate elements stored in the container quickly

Four associative containers set 集合 , multiset 多重集合 , map 映射 , and multimap 多重映射

Container adapters,容器适配器 Constrained versions of sequence containers stack 栈 , queue 队列 , and priority_queue 优先队列 4

Container Classes

5

STL Container Header File Applications

vector <vector> For direct access to any element, and quick insertion and deletion at the end of the vector.

deque <deque> For direct access to any element, quick insertion

and deletion at the front and end of the deque.

list <list> For rapid insertion and deletion anywhere.

set <set> For direct lookup, no duplicated elements.

multiset <set> Same as set except that duplicated elements allowed.

map <map> Key/value pair mapping, no duplicates allowed, and

quick lookup using the key.

multimap <map> Same as map, except that keys may be duplicated

stack <stack> Last-in/first-out container.

queue <queue> First-in/first-out container.

priority_queue <queue> The highest-priority element is removed first.

Common Functions to All Containers

6

Functions Description

non-arg constructor Constructs an empty container.

constructor with args In addition to the non-arg constructor, every container

has several constructors with args.

copy constructor Creates a container by copying the elements from an

existing container of the same type.

destructor Performs cleanup after the container is destroyed.

empty() Returns true if there are no elements in the container.

size() Returns the number of elements in the container.

operator= Copies one container to another.

Relational operators The elements in the two containers are compared

(<, <=, >, >=, sequentially to determine the relation.

==, and !=)

Common Functions to Sequence/Associative Containers

7

Functions Description

c1.swap(c2) Swap the elements of two containers c1 and c2.

c.max_size() Returns the maximum number of elements a container can hold.

c.clear() Erases all the elements from the container.

c.begin() Returns an iterator to the first element in the container.

c.end() Returns an iterator that refers to the next position after the

end of the container.

c.rbegin() Returns an iterator to the last element in the container for

processing the elements in reverse order.

c.rend() Returns an iterator that refers to the position before the

first element in the container

c.erase(beg, end) Erases the elements in the container from beg to end-1. Bothe

beg and end are iterators.

Simple Demo

Listing 22.1 gives a simple example that demonstrates how to create a vector, list, deque, set, multiset, stack, and queue.

8

SimpleSTLDemoSimpleSTLDemo

§22.2 STL Iterators

Iterators are objects to facilitate traversing through the elements in a container

A iterator is like a built-in pointer that can manipulate the elements in a container

9

IteratorDemoIteratorDemo

element 1

begin()

… element 2 element n

end()

Pointers themselves are iterators. The array pointers can be treated as iterators.

Type of Iterators

Different containers may have different types of iterators

Five types: Input (Output) iterator

For reading/writing from/to container Moving only in forward direction

Forward iterator Combination of input/output iterator

Bidirectional iterator A forward iterator that can move backward

Random access iterator A bidirectional iterator that can jump

10

RandomAccess

Bidirectional

Forward

Input Output

Iterator Types Supported by Containers

11

STL Container Type of Iterators Supported

vector random access iterators deque random access iterators

list bidirectional iterators

set bidirectional iterators

multiset bidirectional iterators

map bidirectional iterators

multimap bidirectional iterators

stack no iterator support

queue no iterator support

priority_queue no iterator support

Predefined Iterators

Iterators have been defined in every containers Using “typedef”

The typedefs of iterators iterator const_iterator reverse_iterator const_reverse_iterator

12

typedef int integer;integer value = 40;

ReverseIteratorDemoReverseIteratorDemo

ConstIteratorDemoConstIteratorDemo

Iterator Operators

Using overloaded operators to manipulate the an iterator Move its position Access the element Compare with other iterators

13

14

Operator Description

All iterators ++p Preincrement an iterator.

p++ Postincrement an iterator.

Input iterators

*p Dereference an iterator (used as rvalue).

p1 == p2 Evaluates true if p1 and p2 point to the same element.

p1 != p2 Evaluates true if p1 and p2 point to different elements.

Output iterators

*p Dereference an iterator (used as lvalue).

Bidirectionl iterators

--p Predecrement an iterator.

p-- Postdecrement an iterator.

Random-access iterators

p += i Increment iterator p by i positions.

p -= i Decrement iterator p by i positions.

p + i Returns an iterator ith position after p.

p - i Returns an iterator ith position before p.

p1 < p2 Returns true if p1 is before p2.

p1 <= p2 Returns true if p1 is before or equal to p2.

p1 > p2 Returns true if p1 is after p2.

p1 >= p2 Returns true if p1 is after p2 or equal to p2.

p[i] Returns the element at the position p offset by i.

Iterator Operator Demo

15

IteratorOperatorDemoIteratorOperatorDemo

vector<int> intVector; intVector.push_back(10); intVector.push_back(20); intVector.push_back(30); intVector.push_back(40); intVector.push_back(50); intVector.push_back(60);

vector<int>::iterator p1 = intVector.begin(); for (; p1 != intVector.end(); p1++){ cout << *p1 << " "; } cout << endl << *(--p1) << endl; cout << *(p1 - 3) << endl; cout << p1[-3] << endl; *p1 = 1234; cout << *p1 << endl;

I/O Steam Iterators

Iterators can also be used to manipulate I/O streams input iterator and output iterator

16

InputOutputStreamIteratorDemoInputOutputStreamIteratorDemo

§22.3 Sequence Containers

Represent linear data structures

17

Headerfile

Strong points Weak points Impl. struct.

vector <vector> Random accessInserting and deleting at the end

Inserting/Deleting in the middle or front

array

deque <deque> Random accessInserting and deleting at the front and end

Inserting/Deleting in the middle

array

list <list> Inserting and deleting anywhere

Random access linkedlist

Common Functions in Sequence Container

18

Functions Description

assign(n, elem) Assign n copies of the specified element in the container.

assign(beg, end) Assign the elements in the range from iterator

beg to iterator end.

push_back(elem) Appends an element in the container.

pop_back() Removes the last element from the container.

front() Returns the reference of the first element.

back() Returns the reference of the last element.

insert(position, elem) Inserts an element at the specified iterator.

Sequence Container: vector

19

vector(n, element)

vector(beg, end)

vector(size)

at(index)

Constructs a vector filled with n copies of

the same element.

Constructs a vector initialized with elements

from iterator beg to end.

Constructs a vector with the specified size.

Returns the element at the specified index.

Functions Description

VectorDemoVectorDemo

An insert call may invalidate previously obtained iterators!

Sequence Container: deque

20

DequeDemoDequeDemo

deque(n, element)

deque(beg, end)

deque(size)

at(index)

push_front(element)

pop_front()

Constructs a deque filled with n copies of

the same element.

Constructs a deque initialized with elements

from iterator beg to end.

Constructs a deque with the specified size.

Returns the element at the specified index.

Inserts the element to the front of the queue.

Removes the element from the front of the queue.

Functions Description

An insert call may invalidate previously obtained iterators!

Sequence Container: list

21

ListDemoListDemo

list(n, element)

list(beg, end)

list(size)

push_front(element)

pop_front(): dataType

remove(element)

remove_if(oper)

splice(pos, list2)

splice(pos1, list2, pos2)

splice(pos1, list2, beg, end)

sort()

sort(oper)

merge(list2)

merge(list2, oper)

reverse()

Constructs a list filled with n copies of the same element.

Constructs a list initialized with elements from iterator beg to end.

Constructs a list initialized with the specified size.

Inserts the element to the front of the queue.

Removes the element from the front of the queue.

Removes all the elements that are equal to the specified element.

Removes all the elements for which oper(element) is true.

All the elements of list2 are moved to this list before the specified position. After invoking this function, list2 is empty.

All the elements of list2 starting from pos2 are moved to this list before pos1. After invoking this function, list2 is empty.

All the elements of list2 from iterator beg to end are moved to this list before pos1. After invoking this function, list2 is empty.

Sorts the elements in the list in increasing order.

Sorts the elements in the list. The sort criterion is specified by oper.

Suppose the elements in this list and list2 are sorted. Merges list2 into this list. After the merge, list2 is empty.

Suppose the elements in this list and list2 are sorted based on sort criterion oper. Merges list2 into this list.

Reverse the elements in this list.

Functions Description

An insert call won’t change the previously obtained iterators!

§22.4 Associative Containers

Represent non-linear data structures Elements in an associative container are sorted

according to some sorting criterion (“<” by default) For fast storage and quick retrieval using keys

22

Headerfile

Strong points Weak points Impl. struct.

setmutlset <set>

For fast storage and quick retrieval using keys

Inserting/Deleting BST

mapmultimap

<map> For fast storage and quick retrieval using keys

Inserting/Deleting BST

Common Functions in Associative Containers

23

Functions Description

find(key) Returns an iterator that points to the element with

the specified key in the container.

lower_bound(key) Returns an iterator that points to the first

element with the specified key in the container.

upper_bound(key) Returns an iterator that points to the next element

after the last element with the specified key in

the container.

count(key) Returns the number of occurrences of the element

with the specified key in the container.

Associative Containers: set and multiset

Mathematical set to store simple elements set and multiset are identical except that

multiset allows duplicate keys

24

SetDemoSetDemo

Associative Containers: map and multimap

Storage of mapping from one data item (a key) to another (a value).

map and multimap are identical except that multimap allows duplicate keys

25

MapDemoMapDemo

§22.5 Container Adapters

Containers adapted from the sequence containers For handling special cases

Programmer can choose an appropriate sequence container for a container adapter

26

Headerfile

Features Impl. struct.

stack <stack> Last-In-First-Out deque*, list, vector

queue <queue> First-In-First-Out deque*, list

priority_queue <queue> Largest-In-First-Out vector*, deque

*: default one

Container Adapter: stack

27

StackDemoStackDemo

Functions Description

push(element) Inserts the element to the top of the stack.

pop() Removes an element from the top of the stack.

top() Returns the top element from the stack without

removing it.

size() Returns the size of the stack.

empty() Returns true if the stack is empty.

Container Adapter: queue

28

QueueDemoQueueDemo

Functions Description

push(element) Inserts the element to the top of the queue.

pop() Removes an element from the top of the queue.

front() Returns the front element from the queue

without removing it.

back() Returns the back element from the queue without

removing it.

size() Returns the size of the queue.

empty() Returns true if the queue is empty.

Container Adapter: priority_queue

29

PriorityQueueDemoPriorityQueueDemo

A Summary

Concepts STL, Container, Iterator, Algorithm Three types of containers

Features of different containers Syntax of declaring container objects Main functions of containers

30