C++ Tutorial/list/list find

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Find element in a list

<source lang="cpp">/* The following code example is taken from the book

* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
  1. include <iostream>
  2. include <list>
  3. include <algorithm>

using namespace std; int main() {

   list<int> coll;
   list<int>::iterator pos;
   // insert elements from 20 to 40
   for (int i=20; i<=40; ++i) {
       coll.push_back(i);
   }
   /* find position of element with value 3
    * - there is none, so pos gets coll.end()
    */
   pos = find (coll.begin(), coll.end(),    // range
               3);                          // value
   
   /* reverse the order of elements between found element and the end
    * - because pos is coll.end() it reverses an empty range
    */
   reverse (pos, coll.end());
   // find positions of values 25 and 35
   list<int>::iterator pos25, pos35;
   pos25 = find (coll.begin(), coll.end(),  // range
                 25);                       // value
   pos35 = find (coll.begin(), coll.end(),  // range
                 35);                       // value
   /* print the maximum of the corresponding range
    * - note: including pos25 but excluding pos35
    */
   cout << "max: " << *max_element (pos25, pos35) << endl;
   // process the elements including the last position
   cout << "max: " << *max_element (pos25, ++pos35) << endl;

}</source>

max: 34
max: 35

Finding and Erasing the First or Last Matching Element

<source lang="cpp">#include <algorithm>

  1. include <functional>
  2. include <iostream>
  3. include <list>
  4. include <string>

using namespace std; class Publication {

  public:
  Publication( string first_name = "", string last_name = "", string title = "", string journal = "", int year = 0 );
  bool operator<( const Publication& rhs ) const;
  // order by date
  string last_name() const;
  void print() const;
  // display publication data
  int year() const;
  private:
  string first_name_;
  string journal_;
  string last_name_;
  string title_;
  int year_;

}; inline Publication::Publication( string first_name, string last_name,

  string title, string journal, int year )
  : first_name_( first_name ), journal_( journal ),
     last_name_( last_name ), title_( title ), year_( year )

{} inline bool Publication::operator<( const Publication& rhs ) const { return year() < rhs.year(); } inline string Publication::last_name() const { return last_name_; } inline void Publication::print() const {

  cout << last_name() << ", " << first_name_ << endl
     << title_ << endl << journal_ << ", " << year()
     << endl << endl;

} inline int Publication::year() const { return year_; } inline bool equals_last_name( const Publication publication,string last_name ) { return publication.last_name() == last_name; } int main( ) {

  list<Publication> publication;
  publication.push_back( Publication( "A", "B", "C","D", 1999 ) );
  publication.push_back( Publication( "E", "F","G","H", 1992 ) );
  publication.push_back( Publication( "I", "J","K","L", 1992 ) );
  publication.sort();
  cout << publication.size() << " PUBLICATIONS\n";
  for_each( publication.begin(), publication.end(),mem_fun_ref( &Publication::print ) );
  // find earliest publication by Reese
  string author( "A" );
  list<Publication>::iterator earliest = find_if( publication.begin(), publication.end(), bind2nd( ptr_fun( equals_last_name ), author ) );
  // if publication found, display and delete it
  if( earliest != publication.end() ) {
     cout << "\nEARLIEST PUBLICATION BY " << author << endl;
     earliest->print();
     publication.erase( earliest );
  }
  else
     cout << "NO PUBLICATIONS BY " << author << endl;
  // find latest publication by A
  list<Publication>::reverse_iterator latest = find_if( publication.rbegin(), publication.rend(), bind2nd( ptr_fun( equals_last_name ), author ) );
  // if publication found, display and delete it
  if( latest != publication.rend() ){
     cout << "\nLATEST PUBLICATION BY " << author << endl;
     latest->print();
     publication.erase( --latest.base() );
  }
  else
     cout << "NO PUBLICATIONS BY " << author << endl;
  // display all remaining publications
  cout << "THERE ARE " << publication.size() << " PUBLICATIONS REMAINING\n";
  for_each( publication.begin(), publication.end(), mem_fun_ref( &Publication::print ) );

}</source>

Find the maximum element in a range in a list

<source lang="cpp">/* The following code example is taken from the book

* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
  1. include <iostream>
  2. include <list>
  3. include <algorithm>

using namespace std; int main() {

   list<int> coll;
   list<int>::iterator pos;
   // insert elements from 20 to 40
   for (int i=20; i<=40; ++i) {
       coll.push_back(i);
   }
   /* find position of element with value 3
    * - there is none, so pos gets coll.end()
    */
   pos = find (coll.begin(), coll.end(),    // range
               3);                          // value
   
   /* reverse the order of elements between found element and the end
    * - because pos is coll.end() it reverses an empty range
    */
   reverse (pos, coll.end());
   // find positions of values 25 and 35
   list<int>::iterator pos25, pos35;
   pos25 = find (coll.begin(), coll.end(),  // range
                 25);                       // value
   pos35 = find (coll.begin(), coll.end(),  // range
                 35);                       // value
   /* print the maximum of the corresponding range
    * - note: including pos25 but excluding pos35
    */
   cout << "max: " << *max_element (pos25, pos35) << endl;
   // process the elements including the last position
   cout << "max: " << *max_element (pos25, ++pos35) << endl;

}</source>

max: 34
max: 35