class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

основы С++

STL

реализация STL
обзор
строки
потоки ввода/вывода
Форматирование ввода/вывода
Функции и методы потоков
Файловые потоки
класс vector
очередь
стек
отображения
итераторы
функциональные объекты
алгоритмы (1)
алгоритмы (2)
класс valarray

Справочник по C++ STL

Отображения (ассоциативные массивы)

Ассоциативные массивы в stl реализуются шаблонами классов map и multimap.

Включаемый файл

#include <map>

Для хранения пары ключ/значение используются stl класс pair.

typedef pair<const Key, Type> value_type;

Элементы автоматически сортируются. Элементы класса map имеют только уникальные значения ключей. А класс multimap может иметь несколько элементов с одинаковым значением ключа.

итераторы

размер отображения

работа с ключами

работа с элементами

прочие методы

Для классов перегружены операции =,[],==,!=,<,>,<=,>=.

пример для map

Ниже приведен пример создания словаря унарных математических функций с помощью класса map и вычисление этих функций по словарю.


#include<iostream>
#include<map>
#include<string>
#include<functional>
#include<math.h>
#define PI 3.1415926
using namespace std;

typedef  pointer_to_unary_function<double,double>fdu;
map<string,fdu> funcs; 
void testFuncs();

// инициализируем словарь функций
void initFuncs(){
funcs.insert(make_pair("sin",ptr_fun(sin)));
funcs.insert(make_pair("abs",ptr_fun(fabs)));
//...
}

//---------------------------------------------
int main(){

initFuncs();

// используем наш словарь для вычислений
cout<<funcs["abs"](-23)<<endl;
cout<<funcs["sin"](PI/2)<<endl;
cout<<funcs["sin"](PI/6)<<endl;

// тест с ручным вводом
// testFuncs();

return 0;
}

//---------------------------------------------
void testFuncs(){
string key=""; double arg=0;

// выполняем пока не будет набран
// не существующий ключ
// можно также сделать потомка от map
// с возбуждением исключения в [] при не существующем ключе
while(1){
cout<<"input function name and argument:"<<endl;
cin>>key;

// проверка есть ли элемент
// с указанным ключом
if(!funcs.count(key)){
  cout<<"no function "<<key<<endl<<"exit"<<endl;
  break;
}

cin>>arg;
cout<<"result: "<<funcs[key](arg)<<endl;
}

}

хеш отображения

В дополнение к стандарту stl многие компиляторы реализовали дополнительные классы hash_map и hash_multimap. В нем элементы не сортируются. А для быстрого доступа к элементу по ключу используется специальная хеш-функция.

Включаемый файл зависит от компилятора. Так в MinGw это

#include <ext/hash_map>

В других компиляторах это может быть

#include <hash_map>

Для использования этого класса в MinGw необходимо использовать пространство имен __gnu_cxx.

Во-вторых, часто типом для ключа является строка. А в MinGw (возможно старых версий как у меня) определена хеш-функция только для С строк, но не для класса string. Решается эта проблема специализацией шаблона хеш-функции для класса string. Этот код можно вынести во включаемый файл или вставлять его перед объявлением первой переменной такого типа.

В остальном классы аналогичны map и multimap. Так что переделка предыдущего примера с использованием hash_map для MinGw не составляет труда.


...
#include <ext/hash_map>
...
using namespace __gnu_cxx;

// специализация шаблона хеш-функции для класса string
namespace __gnu_cxx{
template<> struct hash<std::string> {
  size_t operator()(const std::string& s) const {
    return __stl_hash_string(s.c_str());
  }
};
}
...
hash_map<string,fdu> funcs;
...

Эти классы включены в последние стандарты C++ под именами unordered_map и unordered_multimap.


Рейтинг@Mail.ru