Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture 7-3 : STL Algorithms. STL Algorithms The Standard Template Library not only contains container classes, but also algorithms that operate on sequence.

Similar presentations


Presentation on theme: "Lecture 7-3 : STL Algorithms. STL Algorithms The Standard Template Library not only contains container classes, but also algorithms that operate on sequence."— Presentation transcript:

1 Lecture 7-3 : STL Algorithms

2 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 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

3 Example: STL Algorithm –sort() Let vector A; for some class T. Let vector ::iterator p, q sort(p, q) sorts A between p and q. Common case is sort(A.begin(), A.end()); sorts all of A.

4 example // sort without comparators #include using namespace std; template void Display(Iterator start, Iterator end) { for( Iterator p = start; p != end; ++p ) cout<< *p << “ “; } int main() { vector 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 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

5 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.

6 See also sort() for user defined types example : stl_sort.cpp

7 Another Example: STL Algorithm – find() #include int main() { list composer; composer.push_back(“Mozart”); composer.push_back(“Bach”); composer.push_back(“Chopin”); composer.push_back(“Beethoven”); list ::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; }

8 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 2 nd 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 void my_initialization(T& x) { const int N = 39; for (int j = 0; j < N; ++j) { x.push_back( f(j) ); }

9 Example #include #include ''init.cpp'' int main() { const int search_value= 341; vector x; my_initialization(x); vector ::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; }

10 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 IteratorT Find( IteratorT begin, IteratorT end, const T& value ) { for ( ; begin != end ; begin++) if (*begin == value) break; return begin; }

11 find() for user defind type operator== is necessary (no necessary for built-in type) #include 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 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 ::iterator p; p=find(vec.begin(),vec.end(),3); cout key height weight << endl; return 1; }

12 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 using namespace std; bool IsOdd (int i) { return ((i%2)==1); } int main () { vector myvector; vector ::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

13 Many other useful functions…


Download ppt "Lecture 7-3 : STL Algorithms. STL Algorithms The Standard Template Library not only contains container classes, but also algorithms that operate on sequence."

Similar presentations


Ads by Google