C++ Tutorial/set multiset/set loop

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

Loop through a set backward

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

  1. include <functional>
  2. include <iostream>
  3. include <set>
  4. include <string>
  5. include <utility>
  6. include <vector>

using namespace std; class Dog {

  public:
  Dog( string name = "Unknown", string breed = "Poodle",int year = 2000 );
  bool operator<( const Dog& rhs ) const;
  string breed() const;
  string name() const;
  void print() const;
  int year() const;
  private:
  string breed_;
  string name_;
  int year_;

}; inline Dog::Dog( string name, string breed, int year )

  : breed_( breed ), name_( name ), year_( year )

{} // empty inline bool Dog::operator<( const Dog& rhs ) const { return name() < rhs.name(); } inline string Dog::breed() const { return breed_; } inline string Dog::name() const { return name_; } inline void Dog::print() const {

  cout << name() << ", a " << breed() << ", won in " << year()
     << endl;

} inline int Dog::year() const { return year_; } bool equal_breed( const Dog winner, string breed );

int main( ) {

  const char* breed[] = { "A","B", "C","D", "E" };
  const char* name[] = { "a","b", "c","d", "e" };
  const int year[] = { 1971, 1972, 1973, 1974, 1975 };
  const int num_dogs = sizeof( breed ) / sizeof( breed[0] );
  vector<Dog> v;
  for( int i = 0; i < num_dogs; ++i )
     v.push_back( Dog( name[i], breed[i], year[i] ) );
  const Dog query( "A" );
  cout << query.name();
  set<Dog> winner_set( v.begin(), v.end() );
  set<Dog>::const_iterator winner_set_end = winner_set.end();
  // last occurrence in set, not by value
  const string query_breed( "Spaniel (English Springer)" );
  cout << query_breed << endl;
  set<Dog>::const_reverse_iterator last1;
  set<Dog>::const_reverse_iterator winner_set_rend
     = winner_set.rend();
  for( last1 = winner_set.rbegin(); last1 != winner_set_rend;++last1 )
     if( last1->breed() == query_breed )
        break;
  if( last1 != winner_set_rend )
     last1->print();
  else
     cout << "A " << query_breed << " didn"t win in 1971-1975\n";

} inline bool equal_breed( const Dog winner, string breed ) { return winner.breed() == breed; }</source>

Loop through a set forward

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

  1. include <functional>
  2. include <iostream>
  3. include <set>
  4. include <string>
  5. include <utility>
  6. include <vector>

using namespace std; class Dog {

  public:
  Dog( string name = "Unknown", string breed = "Poodle",int year = 2000 );
  bool operator<( const Dog& rhs ) const;
  string breed() const;
  string name() const;
  void print() const;
  int year() const;
  private:
  string breed_;
  string name_;
  int year_;

}; inline Dog::Dog( string name, string breed, int year )

  : breed_( breed ), name_( name ), year_( year )

{} // empty inline bool Dog::operator<( const Dog& rhs ) const { return name() < rhs.name(); } inline string Dog::breed() const { return breed_; } inline string Dog::name() const { return name_; } inline void Dog::print() const {

  cout << name() << ", a " << breed() << ", won in " << year()
     << endl;

} inline int Dog::year() const { return year_; } bool equal_breed( const Dog winner, string breed );

int main( ) {

  const char* breed[] = { "A","B", "C","D", "E" };
  const char* name[] = { "a","b", "c","d", "e" };
  const int year[] = { 1971, 1972, 1973, 1974, 1975 };
  const int num_dogs = sizeof( breed ) / sizeof( breed[0] );
  vector<Dog> v;
  for( int i = 0; i < num_dogs; ++i )
     v.push_back( Dog( name[i], breed[i], year[i] ) );
  const Dog query( "A" );
  cout << query.name();
  set<Dog> winner_set( v.begin(), v.end() );
  set<Dog>::const_iterator winner_set_end = winner_set.end();
  // search in the set by value
  set<Dog>::const_iterator spot = winner_set.find( query );
  if( spot != winner_set_end )
     spot->print();
  else
     cout << query.name() << " never won best-in-show\n";

} inline bool equal_breed( const Dog winner, string breed ) { return winner.breed() == breed; }</source>