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