Presentation is loading. Please wait.

Presentation is loading. Please wait.

STL Containers Inside Peter Sikachev Institute of Computer Graphics and Algorithms Vienna University of Technology.

Similar presentations


Presentation on theme: "STL Containers Inside Peter Sikachev Institute of Computer Graphics and Algorithms Vienna University of Technology."— Presentation transcript:

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!


Download ppt "STL Containers Inside Peter Sikachev Institute of Computer Graphics and Algorithms Vienna University of Technology."

Similar presentations


Ads by Google