130 likes | 151 Views
Lecture 7-3 : STL Algorithms. STL Algorithms. The Standard Template Library not only contains container classes, but also algorithms that operate on sequence containers. To use them, we must write #include <algorithm> in our program.
E N D
STL Algorithms • The Standard Template Library not only contains container classes, but also algorithms that operate on sequence containers. To use them, we must write #include <algorithm> in our program. • In this lesson we will see a few different algorithms contained in the STL (for others see the textbook): • sort() • find(), find_if() • Etc • binary_search, count, min/max, swap, partition, rotate • set_difference, set_union, set_intersection
Example: STL Algorithm –sort() • Let vector<T> A; for some class T. • Let vector<T>::iterator p, q • sort(p, q) sorts A between p and q. • Common case is sort(A.begin(), A.end()); sorts all of A.
example // sort without comparators #include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; template<class Iterator> void Display(Iterator start, Iterator end) { for( Iterator p = start; p != end; ++p ) cout<< *p << “ “; } int main() { vector<string> composer; composer.push_back(“Mozart”); composer.push_back(“Bach”); composer.push_back(“Chopin”); composer.push_back(“Beethoven”); cout<< “composer: “; Display(composer.begin(), composer.end()); cout<< endl; sort(composer.begin(), composer.end()); cout<< “composer: “; Display(composer.begin(), composer.end()); cout<< endl; vector<int> v; for (int i = 1; i < 13; i++) { v.pushback(i*i % 13); } cout<< “v: “; Display(v.begin(), v.end()); cout<< endl; sort(v.begin(), v.end()); cout<< “v: “; Display(v.begin(), v.end()); cout<< endl; } Output composer: Mozart Bach Chopin Beethoven composer: Bach Beethoven Chopin Mozart v: 1 4 9 3 12 10 1012 3 9 4 1 v: 1 1 3 3 4 4 9 9 10 1012 12
Example: STL Algorithm –sort() • sort() also works with deque objects but not with list objects. • In general, sort() works with any random access sequence container. • Guaranteed O(n log n) running time.
See also sort() for user defined types example : stl_sort.cpp
Another Example: STL Algorithm –find() #include <algorithm> #include <string> #include <list> int main() { list<string> composer; composer.push_back(“Mozart”); composer.push_back(“Bach”); composer.push_back(“Chopin”); composer.push_back(“Beethoven”); list<string>::iterator p; p = find(composer.begin(), composer.end(), “Bach”); if (p == composer.end()) { cout << “Not found.” << endl; } else if (++p != composer.end()) { cout<< “Found before: “ << *p << endl; } else { cout<< “Found at the end.” << endl; } }
Algorithms, Iterators, and Sub-sequences • Sequences/Sub-sequences are specified using iteratorsthat indicate the beginning and the end for an algorithm to work on. • Here we find the 2nd occurrence of the value, 341, in a sequence. // File “init.cpp” int f(int x) { return -x*x + 40*x + 22; } // 22 61 98 133 166 197 226 253 278 301 322 341 358 373 386 397 // 406 413 418 421 422 421 418 413 406 397 386 373 358 341 322 301 template<typename T> void my_initialization(T& x) { const int N = 39; for (int j = 0; j < N; ++j) { x.push_back( f(j) ); } }
Example #include <vector> #include <algorithm> #include ''init.cpp'' int main() { const int search_value= 341; vector<int> x; my_initialization(x); vector<int>::iteratorp; p = find(x.begin(), x.end(), search_value); if (p != x.end()) {// Value found! p = find(++p, x.end(), search_value); // Find again if (p != x.end()) {// Value found again! cout<< “Found after: “ << *--p << endl; } } }
STL find()–‘Implementation’ • equivalent to : • find() searches linearly through a sequence, and stops when an item matches the 3rd argument. • A big limitation of find()is that it requires an exact match by value. template <class IteratorT, class T> IteratorT Find( IteratorT begin, IteratorT end, const T& value ) { for ( ; begin != end ; begin++) if (*begin == value) break; return begin; }
find() for user defind type • operator== is necessary (no necessary for built-in type) #include <algorithm> #include <vector> #include <iostream> using namespace std; class mytype { public : int key; int height; int weight; mytype(int k, int h, int w) : key(k) , height(h) , weight(w){} bool operator==(const int a) { if (key==a) return true; return false; } }; int main() { vector<mytype> vec; mytype x1(1,172,70); mytype x2(2,163,50); mytype x3(3,178,74); mytype x4(4,185,80); vec.push_back(x1); vec.push_back(x2); vec.push_back(x3); vec.push_back(x4); for (int i=0;i<vec.size();i++) { cout << vec[i].key << " “ << vec[i].height << " “ << vec[i].weight << endl; } vector<mytype>::iterator p; p=find(vec.begin(),vec.end(),3); cout << "found: " << p->key << " " << p->height << " " << p->weight << endl; return 1; }
find_if • Returns an iterator to the first element in the range [first,last) for which applying f to it, is true. // find_if example #include <iostream> #include <algorithm> #include <vector> using namespace std; bool IsOdd (int i) { return ((i%2)==1); } int main () { vector<int> myvector; vector<int>::iterator it; myvector.push_back(10); myvector.push_back(25); myvector.push_back(40); myvector.push_back(55); it = find_if (myvector.begin(), myvector.end(), IsOdd); cout << "The first odd value is " << *it << endl; return 0; } Output : The first odd value is 25