Noeud:find, Noeud « Next »:, Noeud « Previous »:for_each, Noeud « Up »:Generic Algorithms and Function Objects



find

Now that you've had a brief taster with for_each, everything get's a little easier. Understanding the signature of different algorithms becomes instinctively easier the more you use them. find has the following signature:

InputIterator find(InputIterator begin, InputIterator end, const T& val)

It's very straight forward: supply some start and end range, a value to search for, and return the position of where the element was, (find returns end() if the element was not found). There is also another algorithm called find_if that uses some operation to perform a test on the element being searched for:

InputIterator find_if(InputIterator begin, InputIterator end, UnaryPredicate op)

Let's look at find:

     /* generic2.cc
      * Compiled using g++ generic2.cc Address.cc -o generic2
      * Run using ./generic2 */
     #include <algorithm>
     #include <list>
     #include "AddressRepository.hh"
     
     int main()
     {
       list<Address> l;
       l.push_front(addr1);
       l.push_front(addr2);
       l.push_front(addr3);
       l.push_front(addr4);
       l.push_front(addr5);
       Address addr6("Jane", "55 Almond Terrace", "Worcs", 242783);
       list<Address>::iterator pos = find(l.begin(), l.end(), addr6);
       if (pos != l.end())
         {
           cout << "Found : ";
           pos->print();
         }
       return 0;
     }
     
     Example 3.20: generic2.cc
     

Once again, the example is easy to follow: we just supply the populated list to the find algorithm using begin() and end() and specify that we want to find a match with addr6. Note that since we test only for the name of an Address object, any Address object with the name "Jane" would have satisfied the search.

What about find_if? It's pretty straight forward really, and involves using bind2nd():

     /* generic3.cc
      * Compiled using g++ generic3.cc Address.cc -o generic3
      * Run using ./generic3 */
     #include <algorithm>
     #include <functional>
     #include <list>
     #include "AddressRepository.hh"
     
     int main()
     {
       list<Address> l;
       l.push_front(addr1);
       l.push_front(addr2);
       l.push_front(addr3);
       l.push_front(addr4);
       l.push_front(addr5);
       Address addr6("Jane", "55 Almond Terrace", "Worcs", 242783);
       list<Address>::iterator pos = find_if(l.begin(), l.end(),
     					bind2nd(less<Address>(), addr6));
       if (pos != l.end())
         {
           cout << "Found : ";
           pos->print();
         }
       return 0;
     }
     
     Example 3.21: generic3.cc
     

The code is almost the same as the previous example using find(), except this time we need a unary predicate as the third argument to find_if(). We achieve this by saying that we want to find any Address object less than addr6, in other words any Address object less than "Jane". Since "Bob" is the first element we'll encounter and is less than "Jane" according to our less-than sorting criterion, pos is assigned to the iterator that points to "Bob".