C++ Tutorial/list/list find
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. */
- include <iostream>
- include <list>
- 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>
- include <functional>
- include <iostream>
- include <list>
- 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. */
- include <iostream>
- include <list>
- 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