1  #include <string>
  2  #include <iostream>
  3  #include <map>
  4  
  5  using namespace std;
  6  
  7  /**
  8     TelephoneDirectory maintains a map of name/number pairs.
  9  */
 10  class TelephoneDirectory 
 11  {
 12  public:
 13     /**
 14        Add a new name/number pair to database.
 15        @param name the new name
 16        @param number the new number
 17     */
 18     void add_entry(string name, int number);
 19  
 20     /**
 21        Find the number associated with a name.
 22        @param name the name being searched
 23        @return the associated number, or zero 
 24        if not found in database
 25     */
 26     int find_entry(string name) const;
 27  
 28     /**
 29        Print all entries on given output stream
 30        in name : number format ordered by name.
 31        @param out the output stream
 32     */
 33     void print_all(ostream& out) const;
 34  
 35     /**
 36        Print all entries on given output stream
 37        in number : name format ordered by number.
 38        @param out the output stream
 39     */
 40     void print_by_number(ostream& out) const;
 41  private:
 42     map<string, int> database;
 43     typedef map<string, int>::const_iterator iterator;
 44  };
 45  
 46  void TelephoneDirectory::add_entry(string name, int number)
 47  {
 48     database[name] = number;
 49  }
 50  
 51  int TelephoneDirectory::find_entry(string name) const
 52  {
 53     iterator p = database.find( name );
 54     if (p != database.end())
 55        return p->second;
 56     return 0; // not found
 57  }
 58  
 59  void TelephoneDirectory::print_all(ostream& out) const
 60  {
 61     iterator current = database.begin();
 62     iterator stop = database.end();
 63     while (current != stop)
 64     {
 65        out << current->first << " : " << current->second << "\n";
 66        ++current;
 67     }
 68  }
 69  
 70  void TelephoneDirectory::print_by_number(ostream& out) const
 71  {
 72     multimap<int, string> inverse_database;
 73     typedef multimap<int, string>::iterator miterator;
 74     iterator current = database.begin();
 75     iterator stop = database.end();
 76     while (current != stop)
 77     {
 78        inverse_database.insert(
 79           multimap<int, string>::value_type(current->second, current->first));
 80        ++current;
 81     }
 82     miterator icurrent = inverse_database.begin();
 83     miterator istop = inverse_database.end();
 84     while (icurrent != istop)
 85     {
 86        cout << icurrent->first << " : " << icurrent->second << "\n";
 87        ++icurrent;
 88     }
 89  }
 90  
 91  int main()
 92  {
 93     TelephoneDirectory data;
 94     data.add_entry("Fred", 7235591);
 95     data.add_entry("Mary", 3841212);
 96     data.add_entry("Sarah", 3841212);
 97     cout << "Number for Fred " << data.find_entry("Fred") << "\n";
 98     cout << "Printing by name \n";
 99     data.print_all(cout);
100     cout << "Printing by number \n";
101     data.print_by_number(cout);
102     return 0;
103  }