stl sample

// マップの簡単な使用例
#include < iostream>
#include < map>
using namespace std;

int main()
{
  map< char, int> m;
  int i;

  // マップにペアを挿入する
  for(i=0; i<26; i++) 
    m.insert(pair< char, int>('A'+i, 65+i));

  char ch;
  cout << "Enter key: ";
  cin >> ch;

  map< char, int>::iterator p;
  
  // 与えられたキーに対応する値を探す
  p = m.find(ch);
  if(p != m.end()) 
    cout << "Its ASCII value is  " << p->second;
  else
    cout << "Key not in map.\n";

  return 0;
}


// 反復子を使ってマップを巡回する
#include < iostream>
#include < map>
using namespace std;

int main()
{
  map< char, int> m;
  int i;

  // マップにペアを挿入する
  for(i=0; i<26; i++)
    m.insert(pair< char, int>('A'+i, 65+i));

  map< char, int>::iterator p;
  
  // マップの内容を表示する
  for(p = m.begin(); p != m.end(); p++) {
    cout << p->first << " has ASCII value of ";
    cout << p->second << endl;
  }

  return 0;
}


// マップを逆順に巡回する
#include < iostream>
#include < map>
using namespace std;

int main()
{
  map< char, int> m;
  int i;

  // マップにペアを挿入する
  for(i=0; i<26; i++)
    m.insert(pair< char, int>('A'+i, 65+i));

  map< char, int>::reverse_iterator p;
  
  // マップの内容を表示する
  for(p = m.rbegin(); p != m.rend(); p++) {
    cout << p->first << " has ASCII value of ";
    cout << p->second << endl;
  }

  return 0;
}

// []を使用する
#include < iostream>
#include < map>
using namespace std;

int main()
{
  map< char, int> m;
  int i;

  // マップにペアを挿入する
  for(i=0; i<26; i++)
    m.insert(pair< char, int>('A'+i, 65+i));

  char ch;
  cout << "Enter key: ";
  cin >> ch;

  // 与えられたキーに対応する値を探す
  cout << "Its ASCII value is  " << m[ch];

  return 0;
}

// []は自動的に要素を挿入する
#include < iostream>
#include < map>
using namespace std;

int main()
{
  map< char, int> m;

  cout << "Initial size of map: " << m.size() << endl;

  // 与えられたキーに対応する値を探す
  cout << "The value associated with A is " << m['A'];
  cout << endl;

  cout << "Size of map is now: " << m.size() << endl;

  return 0;
}

// []を使って要素を挿入する
#include < iostream>
#include < map>
using namespace std;

int main()
{
  map< char, int> m;
  int i;

  // []を使ってペアを挿入する
  for(i=0; i<26; i++) m['A'+i] = 65+i;

  char ch;
  cout << "Enter key: ";
  cin >> ch;

  // 与えられたキーに対応する値を探す
  cout << "Its ASCII value is  " << m[ch];

  return 0;
}

// マップには重複するキーを格納できない
#include < iostream>
#include < map>
using namespace std;

int main()
{
  map< char, int> m;
  pair< map< char,int>::iterator, bool> res;

  // Aを挿入する
  res = m.insert(pair< char, int>('A', 65));
  if(res.second) cout << "Insertion occured.\n";

  // 再びAを挿入しようと試みる
  res = m.insert(pair< char, int>('A', 99));
  if(!res.second) cout << "Duplicate not allowed.\n";

  map< char, int>::iterator p;
  
  // 与えられたキーに対応する値を探す
  p = m.find('A');
  cout << "Its ASCII value is " << p->second;

  return 0;
}


// マップを使って電話帳を作成する
#include < iostream>
#include < map>
#include < string>
using namespace std;

// キーのクラス
class name {
  string str;
public:
  name() { str = ""; }
  name(string s) { str = s; }
  string get() { return str; }

};

// nameオブジェクトに対する<演算子が必要
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("Tom"),
                    phoneNum("555-4533")));
  directory.insert(pair< name, phoneNum>(name("Chris"),
                    phoneNum("555-9678")));
  directory.insert(pair< name, phoneNum>(name("John"),
             phoneNum("555-8195")));
  directory.insert(pair< name, phoneNum>(name("Rachel"),
                    phoneNum("555-0809")));

  // 名前から電話番号を見つける
  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;
}


// greater関数オブジェクトを使用する
#include < iostream>
#include < map>
#include < functional>
#include < string>
using namespace std;

int main()
{
  map< string, int, greater< string> > m;

  m["Alpha"] = 20;
  m["Beta"] = 19;
  m["Gamma"] = 10;

  map< string, int, greater< string> >::iterator p;
  
  // マップの要素を表示する
  for(p = m.begin(); p != m.end(); p++) {
    cout << p->first << " has value of ";
    cout << p->second << endl;
  }

  return 0;
}

// マルチマップの例
#include < iostream>
#include < map>
#include < string>
using namespace std;

int main()
{
  multimap< string, string> names;
  string n;

  names.insert(pair< string, string>("Jones", "Fred"));
  names.insert(pair< string, string>("Jones", "Alice"));

  names.insert(pair< string, string>("Smith", "Tom"));
  names.insert(pair< string, string>("Smith", "Alicia"));
  names.insert(pair< string, string>("Smith", "Jon"));

  names.insert(pair< string, string>("Doe", "Harvey"));
  names.insert(pair< string, string>("Doe", "Wilma"));
  names.insert(pair< string, string>("Doe", "Rachel"));

  names.insert(pair< string, string>("Johnson", "J.T."));

  multimap< string, string>::iterator p;
  
  cout << "Enter last name: ";
  cin >> n;

  // 最初に一致する反復子を取得する
  p = names.find(n);
  if(p != names.end()) { // 名前を見つける
    do {
      cout << n << ", " << p->second;
      cout << endl;
      p++;
    } while (p != names.upper_bound(n));
  }
  else
    cout << "Name not found.\n";

  return 0;
}

// マルチマップを使って電話帳を改版する
#include < iostream>
#include < map>
#include < string>
using namespace std;

// キーのクラス
class name {
  string str;
public:
  name() { str = ""; }
  name(string s) { str = s; }
  string get() { return str; }

};

// nameオブジェクトに対する<演算子が必要
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()
{
  multimap< name, phoneNum> directory;

 // 名前と電話番号をマルチマップに挿入する
  directory.insert(pair< name, phoneNum>(name("Tom"),
                    phoneNum("555-4533")));
  directory.insert(pair< name, phoneNum>(name("Tom"),
                    phoneNum("555-9999")));
  directory.insert(pair< name, phoneNum>(name("Chris"),
                    phoneNum("555-9678")));
  directory.insert(pair< name, phoneNum>(name("John"),
             phoneNum("555-8195")));
  directory.insert(pair< name, phoneNum>(name("Rachel"),
                    phoneNum("555-0809")));
  directory.insert(pair< name, phoneNum>(name("Rachel"),
                    phoneNum("555-3434")));
  directory.insert(pair< name, phoneNum>(name("Rachel"),
                    phoneNum("555-7776")));

  // 名前から電話番号を見つける
  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;
}
1