Download presentation
Presentation is loading. Please wait.
Published byGriselda Maxwell Modified over 8 years ago
1
STL Containers Inside Peter Sikachev Institute of Computer Graphics and Algorithms Vienna University of Technology
2
Peter Sikachev 1 Overview Introduction Iterators vector list set and map Performance Overview
3
Peter Sikachev 2 What is a Container? Container is a class, a data structure, or an abstract data type whose instances are collections of other objects
4
Peter Sikachev 3 What is a Container? Container is a class, a data structure, or an abstract data type whose instances are collections of other objects std::vector vecNumbers;
5
contiguous memory vector string deque … associative set, map multiset, multimap hash_set … Peter Sikachev 4 Types of the Containers Containers lists list …
6
Peter Sikachev 5 Iterator Iterator is an object that allows a programmer to traverse through all the elements of a collection, regardless of its specific implementation
7
Peter Sikachev 6 Iterator vector elem for (int* i = &Number[0]; i < &Number + Number.size(); i++) { *i = …; }
8
Peter Sikachev 7 Iterator vector for (std::vector ::iterator i = Numbers.begin(); i < Numbers.end(); i++) { *i = …; } elem
9
Peter Sikachev 8 Iterator vector list for (std::list ::iterator i = Numbers.begin(); i < Numbers.end(); i++) { *i = …; } nextprev elem nextprev elem
10
Peter Sikachev 9 Iterator for (std::set ::iterator i = Numbers.begin(); i < Numbers.end(); i++) { *i = …; } vectorsetlist
11
Peter Sikachev 10 Iterator Categories Iterators input x=*i, ++ output x=*i, ++ forward bidirectional -- random acess +n, -n, += n, -= n,, =
12
Peter Sikachev 11 Iterator Adapters Insert Reverse Stream (for input and output)
13
Peter Sikachev 12 Iterator Adapters Insert Reverse Stream (for input and output)
14
Peter Sikachev 13 Inserter values results 123 …………
15
Peter Sikachev 14 Inserter int MultiplyByTen(int x); vector values; … vector results; transform(values.begin(), values.end(), results.end(), transmogrify); values results 123 …………
16
Peter Sikachev 15 Inserter int MultiplyByTen(int x); vector values; … vector results; transform(values.begin(), values.end(), results.end(), transmogrify); values results 123 ………… Runtime error!
17
Peter Sikachev 16 Inserter int MultiplyByTen(int x); vector values; … vector results; transform(values.begin(), values.end(), back_inserter(results), transmogrify); values results 123 …………102030
18
Peter Sikachev 17 Inserter int MultiplyByTen(int x); vector values; … list results; transform(values.begin(), values.end(), front_inserter(results), transmogrify); values results 123 …………102030
19
Peter Sikachev 18 Inserter int MultiplyByTen(int x); vector values; … list results; transform(values.rbegin(), values.rend(), front_inserter(results), transmogrify); values results 123 …………302010
20
Peter Sikachev 19 Inserter int MultiplyByTen(int x); vector values; … vector results; transform(values.begin(), values.end(), inserter(results, results.begin() + results.size() / 2), transmogrify); values results 123 …………302010
21
Peter Sikachev 20 vector “Growing Array” elem vecNumbers.size(); vecNumbers.capacity(); Costs Find – O(n) Insert – O(n) Random Access – O(1) Erase – O(n)
22
Peter Sikachev 21 vector “Growing Array” elem vecNumbers.size(); vecNumbers.capacity(); std::vector vecNumbers; int k; … vecNumbers.push_back(k); elem
23
Peter Sikachev 22 vector “Growing Array” elem vecNumbers.size(); vecNumbers.capacity(); std::vector vecNumbers; int k; … vecNumbers.push_back(k); elem
24
Peter Sikachev 23 vector “Growing Array” elem vecNumbers.size(); vecNumbers.capacity(); std::vector vecNumbers; int k; … vecNumbers.push_back(k); elem
25
Peter Sikachev 24 vector “Growing Array” elem vecNumbers.size(); vecNumbers.capacity(); std::vector vecNumbers; int k; … vecNumbers.push_back(k); elem What next?
26
Peter Sikachev 25 vector Reallocation New size may vary (typically 1.5-2 old size) Problems? elem
27
Peter Sikachev 26 Reallocation Problems Copying (copy constructors) Iterators invalidation Unused capacity
28
Peter Sikachev 27 Avoiding Reallocations std::vector vecNumbers; for (int i = 0; i < 1000; i++) { vecNumbers.push_back(…); }
29
Peter Sikachev 28 Avoiding Reallocations std::vector vecNumbers; for (int i = 0; i < 1000; i++) { vecNumbers.push_back(i); } Up to 18 reallocations!
30
Peter Sikachev 29 Avoiding Reallocations std::vector vecNumbers; vecNumbers.reserve(1000); for (int i = 0; i < 1000; i++) { vecNumbers.push_back(i); }
31
Peter Sikachev 30 Unused Capacity { vector (vecNumbers.begin(),vecNumbers.end()).swap(vecNumbers); } “The swap trick”
32
Peter Sikachev 31 “Swap Trick” Step-by-Step { vector (vecNumbers.begin(),vecNumbers.end()).swap(vecNumbers); } Create temporary object
33
Peter Sikachev 32 “Swap Trick” Step-by-Step { vector (vecNumbers.begin(),vecNumbers.end()).swap(vecNumbers); } Create temporary object Initialize with the old vector values
34
Peter Sikachev 33 “Swap Trick” Step-by-Step { vector (vecNumbers.begin(),vecNumbers.end()).swap(vecNumbers); } Create temporary object Initialize with the old vector values Swap pointers
35
Peter Sikachev 34 “Swap Trick” Step-by-Step { vector (vecNumbers.begin(),vecNumbers.end()).swap(vecNumbers); } Create temporary object Initialize with the old vector values Swap pointers Delete old vector
36
Peter Sikachev 35 Removing the Elements It should be straightforward, isn’t it?
37
Peter Sikachev 36 Removing the Elements It should be straightforward, isn’t it? No, it isn’t!
38
Peter Sikachev 37 Removing the Elements vector v; v.reserve(10); for (int i = 1; i <= 10; i++) { v.push_back(i); } v[3] = v[5] = v[9] = 99; remove(v.begin(), v.end(), 99);
39
Peter Sikachev 38 Removing the Elements vector v; v.reserve(10); for (int i = 1; i <= 10; i++) { v.push_back(i); } v[3] = v[5] = v[9] = 99; remove(v.begin(), v.end(), 99); 991235 789 v.begin()v.end()
40
Peter Sikachev 39 Removing the Elements vector v; v.reserve(10); for (int i = 1; i <= 10; i++) { v.push_back(i); } v[3] = v[5] = v[9] = 99; vector ::iterator newEnd(remove(v.begin(), v.end(), 99)); 5123789??? v.begin()v.end() newEnd
41
Peter Sikachev 40 Removing the Elements vector v; v.reserve(10); for (int i = 1; i <= 10; i++) { v.push_back(i); } v[3] = v[5] = v[9] = 99; remove(v.begin(), v.end(), 99); 51237898999 v.begin()v.end()
42
Peter Sikachev 41 Removing the Elements vector v; v.reserve(10); for (int i = 1; i <= 10; i++) { v.push_back(i); } v[3] = v[5] = v[9] = 99; v.erase(remove(v.begin(), v.end(), 99),v.end()); 5123789 v.begin()v.end()
43
Peter Sikachev 42 list just a list (hence the name!) Costs Find – O(n) Insert – O(1) Random Access – O(n) Erase – O(1) nextprev elem nextprev elem
44
Peter Sikachev 43 Checking the Emptiness if (c.size() == 0)…if (c.empty())…
45
Peter Sikachev 44 Checking the Emptiness if (c.size() == 0)…if (c.empty())… badgood
46
Peter Sikachev 45 Checking the Emptiness if (c.size() == 0)…if (c.empty())… bad – O(n)good – O(1)
47
Peter Sikachev 46 Why? list list1; list list2; … list1.splice( list1.end(), list2, find(list2.begin(), list2.end(), 5), find(list2.rbegin(), list2.rend(), 10).base() ); /* move all nodes in list2 from the first occurrence of 5 through the last occurrence of 10 to the end of list1. “base()” converts a reverse_iterator into the “corresponding” iterator */
48
Peter Sikachev 47 Why? list list1; list list2; … list1.splice( list1.end(), list2, find(list2.begin(), list2.end(), 5), find(list2.rbegin(), list2.rend(), 10).base() ); /* move all nodes in list2 from the first occurrence of 5 through the last occurrence of 10 to the end of list1. “base()” converts a reverse_iterator into the “corresponding” iterator */ size unknown!
49
Peter Sikachev 48 set and map Organized as a binary search tree node.value > node.leftSubtree.values node.value < node.rightSubtree.values both the left and right subtrees must also be binary search trees. Costs Find – O(log(n)) Insert – O(log(n)) Random Access(?) – O(log(n)) Erase – O(log(n))
50
Peter Sikachev 49 Inserting a new element 1
51
Peter Sikachev 50 Inserting a new element 1 2
52
Peter Sikachev 51 Inserting a new element 1 2 3
53
Peter Sikachev 52 Inserting a new element 1 2 3 4
54
Peter Sikachev 53 Inserting a new element 1 2 3 4 5
55
Peter Sikachev 54 Inserting a new element 1 2 3 4 5 6 Costs Find – O(n) Insert – O(n) Random Access(?) – O(n) Erase – O(n) Limiting subtree height is needed
56
Peter Sikachev 55 Red-Black Tree 1.A node is either red or black. 2.The root is black. 3.All leaves are black. 4.Both children of every red node are black. 5.Every simple path from a given node to any of its descendant leaves contains the same number of black nodes. => height < 2 lg (n+1)
57
Peter Sikachev 56 Red-Black Tree New element added is red Adding may violate ONLY rules 2 and 4 Rule 2 => just repaint Otherwise…
58
Peter Sikachev 57 Red-Black Tree Case 1 Case 2 (after that apply 3) Case 3 The similar stuff for deleting
59
Peter Sikachev 58 Consequences No key modifications in place!
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.