C++/Data Structure/Map

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

A map: insert pair, find, end

<source lang="cpp">

  1. include <iostream>
  2. include <map>

using namespace std; int main() {

 map<char, int> mapObject;
 int i;
 for(i = 0; i <10; i++) {
   mapObject.insert(pair<char, int>("A"+i, i));
 }
 char ch;
 cout << "Enter key: ";
 cin >> ch;
 map<char, int>::iterator p;
 
 p = mapObject.find(ch);
 if(p != mapObject.end()) 
   cout << p->second;
 else
   cout << "Key not in map.\n";
 return 0;

}

      </source>


A map of opposites.

<source lang="cpp">

  1. include <iostream>
  2. include <map>
  3. include <cstring>

using namespace std; class StringClass {

 char str[20];

public:

 StringClass() { 
    strcpy(str, ""); 
 }
 StringClass(char *s) { 
    strcpy(str, s); 
 }
 char *get() { 
    return str; 
 }

}; // must define less than relative to StringClass objects bool operator<(StringClass a, StringClass b) {

  return strcmp(a.get(), b.get()) < 0;

} class opposite {

 char str[20];

public:

 opposite() { 
    strcmp(str, ""); 
 }
 opposite(char *s) { 
    strcpy(str, s); 
 }
 char *get() { 
    return str; 
 }

};

int main() {

 map<StringClass, opposite> mapObject;
 mapObject.insert(pair<StringClass, opposite>(StringClass("yes"), opposite("no")));
 mapObject.insert(pair<StringClass, opposite>(StringClass("good"), opposite("bad")));
 mapObject.insert(pair<StringClass, opposite>(StringClass("left"), opposite("right")));
 mapObject.insert(pair<StringClass, opposite>(StringClass("up"), opposite("down")));
 char str[80];
 cout << "Enter word: ";
 cin >> str;
 map<StringClass, opposite>::iterator p;
 
 p = mapObject.find(StringClass(str));
 if(p != mapObject.end()) 
   cout << "Opposite: " <<  p->second.get();
 else
   cout << "Word not in map.\n";
 return 0;

}


      </source>


A map of word opposites, using strings.

<source lang="cpp">

  1. include <iostream>
  2. include <map>
  3. include <string>

using namespace std; int main() {

 map<string, string> mapObject;
 int i;
 mapObject.insert(pair<string, string>("yes", "no"));
 mapObject.insert(pair<string, string>("up", "down"));
 mapObject.insert(pair<string, string>("left", "right"));
 mapObject.insert(pair<string, string>("good", "bad"));
 string s;
 cout << "Enter word: ";
 cin >> s;
 map<string, string>::iterator p;
 
 p = mapObject.find(s);
 if(p != mapObject.end()) 
   cout << "Opposite: " << p->second;
 else
   cout << "Word not in map.\n";
 return 0;

}


      </source>


A simple map: char and int

<source lang="cpp">

  1. include <iostream>
  2. include <map>

using namespace std; int main() {

 map<char, int> mapObject;
 int i;
 for(i = 0; i <26; i++) {
   mapObject.insert(pair<char, int>("A"+i, 65+i));
 }
 char ch;
 cout << "Enter key: ";
 cin >> ch;
 map<char, int>::iterator p;
 
 p = mapObject.find(ch);
 if(p != mapObject.end()) 
   cout << "Its ASCII value is  " << p->second;
 else
   cout << "Key not in map.\n";
 return 0;

}

      </source>


[] automatically inserts elements.

<source lang="cpp">

  1. include <iostream>
  2. include <map>

using namespace std; int main() {

 map<char, int> mapObject;
 cout << "Initial size of map: " << mapObject.size() << endl;
 cout << "The value associated with A is " << mapObject["A"];
 cout << endl;
 cout << "Size of map is now: " << mapObject.size() << endl;
 return 0;

}


      </source>


Cycle through a map in reverse.

<source lang="cpp">

  1. include <iostream>
  2. include <map>

using namespace std; int main() {

 map<char, int> mapObject;
 int i;
 for(i = 0; i <26; i++)
   mapObject.insert(pair<char, int>("A" + i, 65 + i));
 map<char, int>::reverse_iterator p;
 
 for(p = mapObject.rbegin(); p != mapObject.rend(); p++) {
   cout << p->first << " has ASCII value of ";
   cout << p->second << endl;
 }
 return 0;

}


      </source>


Cycle through a map using an iterator.

<source lang="cpp">

  1. include <iostream>
  2. include <map>

using namespace std; int main() {

 map<char, int> mapObject;
 int i;
 for(i = 0; i < 26; i++)
   mapObject.insert(pair<char, int>("A" + i, 65 + i));
 map<char, int>::iterator p;
 
 for(p = mapObject.begin(); p != mapObject.end(); p++) {
   cout << p->first << " has ASCII value of ";
   cout << p->second << endl;
 }
 return 0;

}


      </source>


Demonstrating a multimap.

<source lang="cpp">

  1. include <iostream>
  2. include <map>
  3. include <string>

using namespace std; int main() {

 multimap<string, string> names;
 string n;
 names.insert(pair<string, string>("Z", "F"));
 names.insert(pair<string, string>("Z", "A"));
 names.insert(pair<string, string>("S", "T"));
 names.insert(pair<string, string>("S", "A"));
 names.insert(pair<string, string>("S", "J"));
 names.insert(pair<string, string>("D", "H"));
 names.insert(pair<string, string>("D", "W"));
 names.insert(pair<string, string>("D", "R"));
 multimap<string, string>::iterator p;
 
 cout << "Enter last name: ";
 cin >> n;
 p = names.find(n);
 if(p != names.end()) { // found a name
   do {
     cout << n << ", " << p->second;
     cout << endl;
     p++;
   } while (p != names.upper_bound(n));
 }
 else{
   cout << "Name not found.\n";
 }
 return 0;

}

      </source>


File and map

<source lang="cpp">

  1. include <iostream>
  2. include <string>
  3. include <map>
  4. include <fstream>

using namespace std; int main() {

   map<string, int> hist;                                                  
   ifstream in( "inFile" );                                                
   string word;
   while ( in >> word )                                                    
   hist[ word ]++;                                                         
   in.close();                                                             
   typedef map<string, int>::const_iterator CI;                            
   for ( CI iter = hist.begin(); iter != hist.end(); ++iter )              
       cout << iter->first << "\t" << iter->second << endl;                
   return 0;

}

      </source>


Maps can store only unique keys.

<source lang="cpp">

  1. include <iostream>
  2. include <map>

using namespace std; int main() {

 map<char, int> mapObject;
 pair<map<char,int>::iterator, bool> res;
 res = mapObject.insert(pair<char, int>("A", 65));
 if(res.second) 
    cout << "Insertion occured.\n";
 res = mapObject.insert(pair<char, int>("A", 99));
 if(!res.second) 
    cout << "Duplicate not allowed.\n";
 map<char, int>::iterator p;
 
 p = mapObject.find("A");
 cout << "Its ASCII value is " << p->second;
 return 0;

}


      </source>


Use a map of strings to create a phone directory.

<source lang="cpp">

  1. include <iostream>
  2. include <map>
  3. include <string>

using namespace std; int main() {

 map<string, string> directory;
 directory.insert(pair<string, string>("T", "4444"));
 directory.insert(pair<string, string>("C", "9999"));
 directory.insert(pair<string, string>("J", "8888"));
 directory.insert(pair<string, string>("R", "0000"));
 string s;
 cout << "Enter name: ";
 cin >> s;
 map<string, string>::iterator p;
 
 p = directory.find(s);
 if(p != directory.end()) 
   cout << "Phone number: " << p->second;
 else
   cout << "Name not in directory.\n";
 return 0;

}


      </source>


Use a map to create a phone directory: string class

<source lang="cpp">

  1. include <iostream>
  2. include <map>
  3. include <string>

using namespace std; class name {

 string str;

public:

 name() { 
     str = ""; 
 }
 name(string s) { 
     str = s; 
 }
 string get() { 
     return str; 
 }

}; // Define less than relative to name objects. bool operator<(name a, name b){

  return a.get() < b.get();

} class phoneNum {

 string str;

public:

 phoneNum() { 
     str = ""; 
 }
 phoneNum(string s) { 
     str = s; 
 }
 string get() { 
     return str; 
 }

}; int main() {

 map<name, phoneNum> directory;
 directory.insert(pair<name, phoneNum>(name("J"), phoneNum("999-1111")));
 directory.insert(pair<name, phoneNum>(name("C"), phoneNum("999-2222")));
 directory.insert(pair<name, phoneNum>(name("J"),  phoneNum("555-3333")));
 directory.insert(pair<name, phoneNum>(name("T"),phoneNum("4444")));
 // given a name, find number
 string str;
 cout << "Enter name: ";
 cin >> str;
 map<name, phoneNum>::iterator p;
 
 p = directory.find(name(str));
 if(p != directory.end()) 
   cout << "Phone number: " <<  p->second.get();
 else
   cout << "Name not in directory.\n";
 return 0;

}

      </source>


Use a multimap to create the phone directory.

<source lang="cpp">

  1. include <iostream>
  2. include <map>
  3. include <string>

using namespace std; class name {

 string str;

public:

 name() { 
    str = ""; 
 }
 name(string s) { 
    str = s; 
 }
 string get() { 
    return str; 
 }

};

bool operator<(name a, name b) { // Define less than relative to name objects.

  return a.get() < b.get();

} class phoneNum {

 string str;

public:

 phoneNum() { 
    str = ""; 
 }
 phoneNum(string s) { 
    str = s; 
 }
 string get() { 
    return str; 
 }

};

int main() {

 multimap<name, phoneNum> directory;
 directory.insert(pair<name, phoneNum>(name("T"),    phoneNum("555-4533")));
 directory.insert(pair<name, phoneNum>(name("T"),    phoneNum("555-9999")));
 directory.insert(pair<name, phoneNum>(name("C"),  phoneNum("555-9678")));
 string str;
 cout << "Enter name: ";
 cin >> str;
 multimap<name, phoneNum>::iterator p;
 
 p = directory.find(str);
 if(p != directory.end()) {
   do {
     cout << "Phone number: " <<  p->second.get();
     cout << endl;
     p++;    
   } while(p != directory.upper_bound(str));
 }
 else
   cout << "Name not in directory.\n";
 return 0;

}


      </source>


Use the greater function object in Map

<source lang="cpp">

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

using namespace std; int main() {

 map<string, int, greater<string> > mapObject;
 mapObject["A"] = 20;
 mapObject["B"] = 19;
 mapObject["C"] = 10;
 map<string, int, greater<string> >::iterator p;
 
 for(p = mapObject.begin(); p != mapObject.end(); p++) {
   cout << p->first << " has value of ";
   cout << p->second << endl;
 }
 return 0;

}

      </source>


Using [] in Map

<source lang="cpp">

  1. include <iostream>
  2. include <map>

using namespace std; int main() {

 map<char, int> mapObject;
 int i;
 for(i = 0; i < 26; i++)
   mapObject.insert(pair<char, int>("A" + i, 65 + i));
 char ch;
 cout << "Enter key: ";
 cin >> ch;
 cout << "Its ASCII value is  " << mapObject[ ch ];
 return 0;

}


      </source>