Transcript ppt
The C++ Algorithm Libraries
• A standard collection of generic algorithms
– Applicable to various types and containers • •
E.g.
, sorting integers (
int
) vs. intervals (
pair
)
E.g.
, sorting elements in a
vector
vs. in a C-style array – Polymorphic even without inheritance relationships • Types substituted need not have a common base class • Must only provide the operators the algorithm needs
• Significantly used with the sequence containers
– To reorder elements within a container’s sequence – To store/fetch values into/from a container – To calculate various values and properties from it CSE 332: C++ Algorithms I
Motivating Example: Searching a String
• From Austern: “ Generic Programming and the STL ” • Sequential (linear) search: find
char c
in
string s char * strchr (char* s, char c) { while (*s != 0 && *s != c){ ++s; } return *s == c ? s : (char *) 0; }
• Problem: not very general – “ Range ” of iteration is always defined up to ‘ \0 ’ – Only works for a “ zero terminated ” character string in C/C++ CSE 332: C++ Algorithms I
Improving Linear Search with Ranges
• First generalization (Austern, pp. 11): use a
range (something that sequential containers can give us!)
char * find1 (char* first, char* last, char c){ while ( first != last && * first != c) ++first ; return first; }
• Gives an explicit range (calculate its length – • Assumes first is before last (can check – how?) how?) • Note how caller checks for success changed: why?
CSE 332: C++ Algorithms I
Linear Search over Parameterized Types
• Second generalization: use templates to parameterize the function argument types
template
• How much did the
find1
code need to change?
• One last problem – What if we want to apply this to a container (e.g.,
list
) whose range can’t be traversed via simple pointers?
CSE 332: C++ Algorithms I
Linear Search with Generic Iterators
• Third generalization: separate iterator type parameter • We arrive at the
find
algorithm (Austern pp. 13):
template < typename Iterator, Iterator find ( Iterator typename T> first, Iterator last, } ++first; return first; const T & value) { while (first != last && *first != value)
• Notice how algorithm depends on the iterators • Notice how refinements made algorithm more abstract – … but still essentially does the same thing – i.e., algorithm structure (and time complexity) is the same CSE 332: C++ Algorithms I
Organization of C++ Algorithm Libraries
• The
header file contains – Non-modifying sequence operations • Do some calculation but don’t change sequence itself • Examples include
count
,
count_if
– Mutating sequence operations • Modify the order or values of the sequence elements • Examples include
copy
,
random_shuffle
– Sorting and related operations • Modify the order in which elements appear in a sequence • Examples include
sort
,
next_permutation
• The
header file contains – General numeric operations • Scalar and matrix algebra, especially used with vector
accumulate
,
inner_product
CSE 332: C++ Algorithms I
•
Example of Using Non-Modifying Algorithms
count
algorithm – Moves through iterator range – Checks each position for equality – Increases count if equal
#include
CSE 332: C++ Algorithms I
•
Example of Using Mutating Algorithms
copy
algorithm – Copies from an input iterator range into an output iterator – Note use of default constructor to get an “off-the-end” (here, “end-of-file”) input iterator – Note use of noskipws (need to make sure container behavior matches what you want to do)
ifstream input_file (input_file_name.c_str()); ofstream output_file (output_file_name.c_str()); input_file >> noskipws; istream_iterator
CSE 332: C++ Algorithms I
• •
Example of Using Sorting Algorithms
sort
algorithm – Reorders a given range – Can also plug in a functor to change the ordering function
next_permutation
algorithm – Generates a specific kind of reordering, called a “permutation” – Can use to generate all possible orders of a given sequence
#include
CSE 332: C++ Algorithms I
• •
Example of Using Numeric Algorithms
accumulate
algorithm – Sums up elements in a range (based on a starting sum value)
inner_product
algorithm – Computes the inner (also known as “dot”) product of two matrixes: sum of the products of their respective elements
#include
CSE 332: C++ Algorithms I
Concluding Remarks
• C++ libraries give you useful, generic algorithms – Combine easily with a variety of containers/iterators – Support many common data structure manipulations • Finding and modifying values, re-ordering, numeric operations – Reusing them saves you from writing code • Many STL algorithms can be extended further – Especially by plugging functors into them – Next time we’ll look at how functors work, and how to use them, as well as at algorithms and iterators in more detail CSE 332: C++ Algorithms I