Шаг 16.
Библиотека STL.
Хранение в отображении объектов класса

    На этом шаге мы рассмотрим пример использования объектов некоторого класса в отображении.

    Следующая программа создает простой словарь на основе отображения слов с их значениями. Сначала она создает два класса word и meaning. Поскольку отображение поддерживает отсортированный список ключей, программа также определяет для объектов типа word оператор < .

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <map>
#include <cstring>
#include <winuser.h>
#include <conio.h> //необходимо для getch()
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

class word
{
  char str[20];
public:
  word() { strcpy(str, ""); }
  word(char *s) {strcpy(str, s);}
  char *get() { return str; }
};
bool operator<(word a, word b)
{
  return strcmp(a.get(), b.get()) < 0;
}

class meaning
{
  char str[80];
public:
  meaning() { strcmp(str, ""); }
  meaning(char *s) { strcpy(str, s); }
  char *get() {return str;}
};


int main(int argc, char* argv[])
{
  map<word, meaning> dictionary;

  // Помещаем в отображение объекты
  // классов word и meaning
  dictionary.insert(pair<word, meaning>(
  	word("дом"), meaning("Место проживания")));
  dictionary.insert(pair<word, meaning>(
  	word("программирование"), meaning("Процесс создания программы")));
  dictionary.insert(pair<word, meaning>(
  	word("клавиатура"), meaning("Устройство ввода данных")));
  dictionary.insert(pair<word, meaning>(
  	word("STL"), meaning("Standard Template Library")));

  // По заданному слову находим его значение.
  char str[80];
  cout << ToRus("Введите слово: ");
  cin >> str;
  OemToChar(str,str);
  map<word, meaning>::iterator p;

  p = dictionary.find(word(str));
  if(p != dictionary.end())
  	cout << ToRus("Определение: ") << ToRus(p->second.get());
  else
	cout << ToRus("Такого слова в словаре нет.\n");
//  cin>> str;

  getch();
  return 0;
}
//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Результаты выполнения этой программы представлены на рисунке 1.


Рис.1. Результат работы приложения

    Обращаем внимание на следующую конструкцию в программе:

  cin >> str;
  OemToChar(str,str);

    Здесь используется функция OemToChar(), которая выполняет действие, противоположное результату работы функции CharToOem(). Дело в том, что в словаре русские слова "дом", "программирование", "клавиатура" хранятся в формате Oem, в то время, как с клавиатуры при выполнении конструкции cin >> str; они вводятся в формате char. Поэтому для совмещения форматов мы используем функцию CharToOem().

    Со следующего шага мы начнем знакомиться с алгоритмами.




Предыдущий шаг Содержание Следующий шаг