Presentation is loading. Please wait.

Presentation is loading. Please wait.

Generic Programming and the STL Andreas Fabri GeometryFactory.

Similar presentations


Presentation on theme: "Generic Programming and the STL Andreas Fabri GeometryFactory."— Presentation transcript:

1 Generic Programming and the STL Andreas Fabri GeometryFactory

2 GeometryFactoryGeneric Programming and the STL2 int min(int a, int b) float min(float a, float b) template Comparable min(Comparable a, Comparable b) { return (a<b) ? a : b; } BigInt n(9), m(8), r; r = min( n, m ); BigInt is a model for the concept Comparable 0.1 Function Templates

3 GeometryFactoryGeneric Programming and the STL3 0.2 Class Templates template class list { void push_back(const T& x); typedef... iterator; iterator begin(); iterator end(); }; list ints; list vertex_handles;

4 GeometryFactoryGeneric Programming and the STL4 1 Standard Template Library (STL) Part of ISO-OSI Standard C++ Library 1998 Object oriented programming is about reuse –STL has many reusable components –Divided into containers iterators algorithms

5 GeometryFactoryGeneric Programming and the STL5 1.1Introduction to Containers Three types of containers –sequence containers –associative containers –container adapters Near-containers - similar to containers, without all the capabilities –C-like arrays –string –bitset for maintaining sets of 1 / 0 flag values –valarray - high-speed mathematical vector operations The containers have similar functions

6 GeometryFactoryGeneric Programming and the STL6 1.1Introduction to Containers (II) vector direct access to any element deque rapid insertion at front or back direct access to any element list rapid insertion and deletion anywhere set rapid lookup, no duplicates multiset rapid lookup, duplicates map, multimap store key/value pairs stack last-in-first-out queue first-in-first-out priority_queue highest priority element is first

7 GeometryFactoryGeneric Programming and the STL7 1.1Introduction to Containers (III) Common member functions of all STL containers –constructors, destructors –assignment, all comparison operators –swap –empty –max_size –size Use if(c.empty()) not if(c.size() == 0)

8 GeometryFactoryGeneric Programming and the STL8 1.2Introduction to Iterators Iterators are similar to pointers –point to element in a container –iterator operators uniform for all containers * dereferences, ++ advances pointer container.begin() returns iterator pointing to first element container.end() returns iterator pointing after last element for(it = c.begin(); it != c.end(); it++) {... } it

9 GeometryFactoryGeneric Programming and the STL9 1.2Iterator Categories All iterators: p++, ++p Input iterators: v = *p, p1 = p2, p1 == p2, p1 != p2 Output iterators: *p = v, p1 = p2 Forward iterators: all above Bidirectional iterators: p--, --p Random access iterators: p+=i; p-=i, p+i, p-i,,…

10 GeometryFactoryGeneric Programming and the STL10 1.2Constness of Iterators Examples vector ::iterator it = v.begin(); vector ::const_iterator cit = v.begin(); *cit = 24; // does not compile *it = 24; // ok void fct(const vector & v) { vector ::iterator it; it = v.begin(); // does not compile }

11 GeometryFactoryGeneric Programming and the STL11 1.2Iterator Adapters Everything that behaves like an iterator is an iterator –Insert iterator –Stream iterator –Reverse iterators Example: list L; copy(istream_iterator (cin), istream_iterator ::reverse_iterator r1 = L.rbegin(), r2 = L.rend();

12 GeometryFactoryGeneric Programming and the STL12 1.2CGAL Circulators Geometric structures are often circular Leads to other loop: Circ c1 = vertex.incident_vertices(); Circ done = c1; do { something(*c1); c1++; } while(c1 != done);

13 GeometryFactoryGeneric Programming and the STL13 1.3Introduction to Algorithms STL provides algorithms used generically across containers –operate on elements indirectly through iterators –often operate on sequences of elements defined by pairs of iterators –algorithms often return iterators, such as find() –premade algorithms save programmers time and effort

14 GeometryFactoryGeneric Programming and the STL14 2Sequence Containers Three sequence containers –vector - based on arrays –deque - based on arrays –list - robust linked list

15 GeometryFactoryGeneric Programming and the STL15 2.1 vector Sequence Container vector –#include –data structure with contiguous memory locations –use the subscript operator [] –used when data must be sorted and easily accessible –when memory exhausted allocates a larger, contiguous area of memory copies itself there deallocates the old memory –has a random access iterator

16 GeometryFactoryGeneric Programming and the STL16 2.1 vector Sequence Container Declarations –vector v; –vector v(7812); –template vector v(It begin, It end); –type - int, float, Point, whatsoever –Warning: Beware of vector Iterators: –vector ::const_iterator it; vector ::iterator it = v.begin(); *(it1 + 5) = 34;

17 GeometryFactoryGeneric Programming and the STL17 2.1 vector Sequence Container (II) vector functions, for vector object v v.push_back(value) - add element to end v.size() - current size of vector v.capacity() - how much vector can hold before reallocation v.reserve(n) - allow vector to avoid reallocation v.insert( pointer, value ) - inserts value before pointer. template v.insert( pointer, It begin, It end ).

18 GeometryFactoryGeneric Programming and the STL18 2.1 vector Sequence Container (III) vector functions and operations v.erase( pointer ) remove element from container v.erase( pointer1, pointer2 ) remove elements starting from pointer1 and up to (not including) pointer2. v.clear() erases entire container. v[elementNumber] = value; assign value to an element v.at[elementNumber] = value; as above, with range checking throws out_of_bounds exception

19 GeometryFactoryGeneric Programming and the STL19 2.2 list Sequence Container list container –#include –efficient insertion/deletion anywhere in container –doubly-linked list –bidirectional iterators There exists also a non-standard slist –singly-linked list –forward iterator

20 GeometryFactoryGeneric Programming and the STL20 2.2 list Sequence Container (II) list functions for listObject and otherObject listObject.sort() sorts in ascending order listObject.splice(iterator, otherObject); inserts values from otherObject before location of iterator listObject.merge(otherObject) removes otherObject and inserts it into listObject, sorted listObject.unique() removes duplicate elements listObject.swap(otherObject); exchange contents listObject.assign(iterator1, iterator2) replaces contents with elements in range of iterators listObject.remove(value) erases all instances of value

21 GeometryFactoryGeneric Programming and the STL21 2.3 deque Sequence Container deque ("deek") - double-ended queue –#include –indexed access using [] –efficient insertion/deletion in front and back –non-contiguous memory: "smarter" pointers same basic operations as vector –adds push_front / pop_front - insertion/deletion at beginning of deque

22 GeometryFactoryGeneric Programming and the STL22 3Associative Containers Associative containers –provide direct access to store and retrieve elements via keys (search keys) 4 types: multiset, set, multimap and map –keys in sorted order –multiset and multimap allow duplicate keys –multimap and map allow keys and associate values

23 GeometryFactoryGeneric Programming and the STL23 Excursion: Function Objects template struct less { bool operator()(const T& lhs, const T& rhs) const { return lhs < rhs; } }; less is_smaller; if(is_smaller(45, 34)){..}

24 GeometryFactoryGeneric Programming and the STL24 3.1 multiset Associative Container multiset - fast storage, retrieval of keys –allows duplicates Ordering by comparator function object less - sorts keys in ascending order multiset > integers; CGAL comparator function objects typedef CGAL::Cartesian K; multiset points;

25 GeometryFactoryGeneric Programming and the STL25 3.1 multiset Associative Container (II) Functions for multiset object msObject –msObject.insert(value) - inserts value –msObject.find(value) - returns iterator to first instance of value, or msObject.end() –msObject.lower_bound(value)- returns iterator to first location of value –msObject.upper_bound(value)- returns iterator to location after last occurrence of value –for a pair object p p = msObject.equal_range(value) sets first and second to lower_bound and upper_bound for a given value

26 GeometryFactoryGeneric Programming and the STL26 3.2 set Associative Container set –implementation identical to multiset –unique keys - duplicates ignored and not inserted –supports bidirectional iterators (but not random access) –#include

27 GeometryFactoryGeneric Programming and the STL27 3.4 map Associative Container map –fast storage/retrieval of unique key/value pairs –#include –one-to-one mapping (duplicates ignored) –use [] to access values for map M; M[30] = 4000.21; sets the value of key 30 to 4000.21 –if subscript not in map, creates new key/value pair –Efficiency remark: Use insert to insert, operator[] to update

28 GeometryFactoryGeneric Programming and the STL28 3.5 Non Standard Associative Container hash_(multi)set, hash_(multi)map –Not part of the standard, but provided by some STLs –REALLY fast storage/retrieval of unique key/value pairs –Based on hashing and not on binary trees –No order, but provide iterators CGAL::Unique_hash_map –Does not provide removal, only insertion –No order, no iterators –Designed for speed, and minimal memory consumption

29 GeometryFactoryGeneric Programming and the STL29 4Container Adapters container adapters: stack, queue, priority_queue –not first class containers –do not support iterators –do not provide actual data structure –programmer can select implementation of the container adapters –have member functions push() and pop()

30 GeometryFactoryGeneric Programming and the STL30 4.1 stack Adapter stack –insertions and deletions at one end –last-in-first-out data structure –implemented with vector, list, and deque (default) –#include Declarations stack > myStack; stack > myOtherStack; stack anotherStack;

31 GeometryFactoryGeneric Programming and the STL31 4.2 queue Adapter queue - insertions at back, deletions at front –first-in-first-out data structure –implemented with list or deque –#include Functions –push(element) - (push_back) add to end –pop(element) - (pop_front) remove from front –empty() - test for emptiness –size() - returns number of elements Example: queue values; //create queue values.push(1.2); // values: 1.2 values.push(3.4); // values: 1.2 3.4 values.pop(); // values: 1.2

32 GeometryFactoryGeneric Programming and the STL32 4.3 priority_queue Adapter insertions in sorted order, deletions from front –implemented with vector or deque –highest priority element always removed first heapsort puts largest elements at front less by default, programmer can specify another Functions –push - (push_back then reorder elements ) –pop - (pop_back to remove highest priority element ) –size –empty

33 GeometryFactoryGeneric Programming and the STL33 5Algorithms Before STL –class libraries were incompatible among vendors –algorithms built into container classes STL separates containers and algorithms –easier to add new algorithms –more efficient, avoids virtual function calls

34 GeometryFactoryGeneric Programming and the STL34 Excursion: Function Object Adapters template struct less : public binary_function { bool operator()(const T& lhs, const T& rhs) const { return lhs < rhs; } }; list L(..); less ::iterator it = find_if(L.begin(), L.end(), not1(bind2nd(less (),34)));

35 GeometryFactoryGeneric Programming and the STL35 5.1 for_each, accumulate, transform for_each(iterator1, iterator2, function); list L(..); int sum = accumulate(L.begin(), L.end(), 0, plus ()); transform(istream_iterator (cin), istream_iterator (), ostream_iterator (cout), mem_fun_ref(Point::x));

36 GeometryFactoryGeneric Programming and the STL36 5.2Basic Searching Algorithms find(iterator1, iterator2, value) –returns iterator pointing to first instance of value find_if(iterator1, iterator2, function) –like find, but returns an iterator when function returns true. binary_search(iterator1, iterator2, value) –searches an ascending sorted list for value using a binary search

37 GeometryFactoryGeneric Programming and the STL37 5.3Sorting Algorithms sort(begin, end) partial_sort(begin, begin+N, end) –finds first N and sorts them nth_element(begin, begin+N, end) –finds first N, not sorted partition(begin, end, function) –splits in two intervals stable_sort, stable_partition Remarks –All take optionaly a comparison function –std::sort is faster than clib sort

38 GeometryFactoryGeneric Programming and the STL38 5.4 equal, mismatch, lexicographical_compare Functions to compare sequences of values equal –returns true if sequences are equal (uses == ) –returns false if of unequal length equal(iterator1, iterator2, iterator3); –compares sequence from iterator1 up to iterator2 with the sequence beginning at iterator3 –Containers can be of different types

39 GeometryFactoryGeneric Programming and the STL39 5.5 fill, fill_n, generate, generate_n STL functions, change containers. fill - changes a range of elements (from iterator1 to iterator2 ) to value – fill(iterator1, iterator2, value); fill_n - changes specified number of elements, starting at iterator1 –fill_n(iterator1, quantity, value); generate - like fill, but calls a function for value –generate(iterator1, iterator2, function); generate_n - like fill_n, but calls function for value –generate(iterator1, quantity, value)

40 GeometryFactoryGeneric Programming and the STL40 5.6 swap, iter_swap and swap_ranges swap(element1, element2) - exchanges two values swap( a[ 0 ], a[ 1 ] ); iter_swap(iterator1, iterator2) - exchanges the values to which the iterators refer swap_ranges(iterator1, iterator2, iterator3) - swap the elements from iterator1 to iterator2 with the elements beginning at iterator3

41 GeometryFactoryGeneric Programming and the STL41 5.7 copy_backward, merge, unique, reverse copy_backward(iterator1, iterator2, iterator3) –copy the range of elements from iterator1 to iterator2 into iterator3, but in reverse order. merge(iter1, iter2, iter3, iter4, iter5) –ranges iter1-iter2 and iter3-iter4 must be sorted in ascending order. – merge copies both lists into iter5, in ascending order. unique(iter1, iter2) - removes duplicate elements from a sorted list, returns iterator to new end of sequence. reverse(iter1, iter2)- reverses elements in the range of iter1 to iter2.

42 GeometryFactoryGeneric Programming and the STL42 5.8Remove does (not) Remove Member function: L.remove(Point(0,0)); Algorithm moves at end: list L(istream_iterator (cin), istream_iterator ()); list ::iterator eit; eit = remove(L.begin(), L.end(), Point(0,0)); L.erase(eit, L.end());

43 GeometryFactoryGeneric Programming and the STL43 6 Other Features of the STL Streams strings, wide strings locales (for internationalization) numerical valarray

44 GeometryFactoryGeneric Programming and the STL44 7 References N.M. Josuttis, The C++ Standard Library, Addison- Wesley 2001 S.Meyers, Effective STL, Addison-Wesley 2001 www.sgi.com/STL www.boost.org www.stlport.org www.dinkumware.com


Download ppt "Generic Programming and the STL Andreas Fabri GeometryFactory."

Similar presentations


Ads by Google