      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  }