Introduction to Standard Template Library (STL)
Wenguang Wang and Yanping Zhao March 20, 2000
1
What Is STL?
• A new C++ Library, ANSI standard • Support complex data structures
– Vector (array), list, string, hash, set, map, queue, stack, priority queue...
• Support various algorithms
– Searching, sorting, heap, merging, copying, transforming…
2
Why STL was developed?
• Some basic data structures are used everyday in your programs • Programming them from the scratch is time consuming and error-prone • Most of operations on these structures can be standardized
3
Why we use STL?
• • • • More reliable and efficient implementations Automatic memory management Constructing complex data structures easily Saving programming time and efforts
4
Where are STL and resources?
• GNU g++ on skorpio, ultra*… • Visual C++ • Wenguang Wang’s home page
– http://www.cs.usask.ca/grads/wew036/stl
• Standard Template Library Programmer’s Guide
– http://www.sgi.com/Technology/STL/
5
Fundamental Elements in STL?
• Containers (data structures)
– vector dynamic size – list doubly linked list – string, hash
• Algorithms
– sorting, heap manipulation
• Iterators (pointers)
– A bridge to connect algorithms and containers – Example
6
How to Use STL? (example)
• On Unix
– GNU g++ 2.7.0 and later version
• On Windows
– Visual C++ 5.0 and later version – not fully supported even in Visual C++ 6.0
• no hash table • no rope • more?
• Example
7
Why I am here?
• • • • I learned STL two weeks ago I never heard of STL before After a five minutes STL tour, I can use it ! I found that STL helped me a lot in programming • I want to share it with you
8
Vector -- Advantages
• Data type
– basic type: integer, double, pointer, … – user-defined structures and classes
• Dynamic size
9
int *array = malloc(size*sizeof(int));//allocate
int *temp = realloc(array, new_size*sizeof(int)); if (temp) array = temp; //reallocate
How to get the size of the array?
free(array); // deallocate
Count Count = 0; while(not end) count++;
Estimate #define SIZE 2000
vector
vec; vec.push_back(i);
Vector -- Operations
• Property operations
– [ ] , size, empty
size=8
0 1 2 3 4 5 6 7 begin v[3] end
• Iterator operations
– begin, end
• Manipulation operations
– push_back, pop_back, insert, erase
11
#include #include typedef vector VecInt; void main(){ VecInt vInt; VecInt::iterator it; vInt.push_back(0); vInt.push_back(1); for (it=vInt.begin(); it!=vInt.end(); it++) cout << *it << endl; for (int i=0; i #include typedef list ListInt; void main(){ ListInt lInt; ListInt::iterator it; // stack lInt.push_front(0); lInt.push_front(1); cout << lInt.front() << endl; lInt.pop_front(); lInt.pop_front(); // queue lInt.push_back(2); lInt.push_back(3); cout << lInt.front() << endl; lInt.pop_front(); lInt.pop_front(); // iterator for (it=lInt.begin(); it!=lInt.end(); it++) cout << *it << endl; }
Algorithm -- Heap
• Data structure: vector or C++ array
• make_heap • pop_heap
8 5 7 4 3 6 1 9 4 1 7 5 3 6 8 9 9 5 8 4 3 6 7 1
• push_heap
9 8 7 5 3 6 1 4
15
#include #include #include typedef vector VecInt; void main(){ VecInt vInt(4); int i; vInt[0]=7; vInt[1]=4; vInt[2]=9; vInt[3]=1; make_heap(vInt.begin(), vInt.end()); vInt.push_back(3); push_heap(vInt.begin(), vInt.end()); pop_heap(vInt.begin(), vInt.end()); cout << vInt.back() << endl; vInt.pop_back(); }
User-defined Data Type
struct Event { long timestamp; int type; }; typedef Event* PEvent; typedef vector VecEvent; typedef list ListPEvent;
17
User-defined Data Type (cont.)
page page
class Page { page page int page_num; int modify_flag; page page int reference_cnt; }; typedef list ListPage; typedef ListPage* PListPage; typedef vector VecPListPage;
What is the structure of VecPListPage?
18
Iterator
• Similar to pointer
– *it
• Iterator for list (bidirectional iterator)
– ++it, it++, --it, it--
• Iterator for vector (random access iterator)
– ++it, it++, --it, it-– it+n, itBegin-itEnd
19
More details in: http://www.cs.usask.ca/grads/wew036/stl
20
21
#include #include void main(void) { vector vInt; vector::iterator begin, end; begin = vInt.begin(); end = vInt.end(); sort(begin, end); }
#include //not iostream.h! #include #include #include #include #include #include