Читать статья по информатике, вычислительной технике, телекоммуникациям: "Модуль для работы с ассоциативными массивами в C++ Builder" Страница 1
Модуль для работы с ассоциативными массивами в C++ Builder
Заев А.А.
Вступление
Мой любимый язык – PHP. Он изящен и прост, но, к сожалению, предназначен только для программирования сайтов. «Обычную» программу на нём не напишешь.
К счастью, некоторые технологии, реализованные в PHP можно перенести и в другие языки программирования: например, в C++.
Одна из таких технологий – ассоциативные массивы.
В ассоциативном массиве вместо числовых индексов используются ключи любых типов. Данные в ассоциативном массиве так же могут быть разнотипными.
К примеру:
ass_arr array;
array[0] = 123;
array["name"] = "John Silver";
Здесь в массиве array создаются два элемента, один из которых имеет ключ «0» и числовое значение «123», другой – ключ «name» и строковое значение «John Silver». «ass_arr» – не массив задниц, как подумало большинство читателей, а возможное имя типа (класса) ассоциативного массива.
Удобно? Удобно! Не нужно описывать входящие в массив элементы и их типы. Не нужно думать о размере массива – он динамичен. Не нужно заботится ни о чём, кроме свободной памяти.
Подробнее об удобствах
Ассоциативный массив – всего лишь способ представления данных. Любая задача, решаемая посредством ассоциативных массивов, может быть решена посредством структур или классов. Однако, использование ассоциативности существенно упрощает решение многих задач.
Рассмотрим простой пример. Возьмём структуру, в которой хранятся настройки некоей программы. Опишем её так:
struct preferences
{
int WindowWidth;
int WindowHeight;
int WindowX;
int WindowY;
char documentPath[128];
};
Для сохранения данных этой структуры где-либо, потребуется специальная функция, которая будет «знать» все поля, которые присутствуют в этой структуре. Например, такая:
bool savePreferences(struct preferences* pref)
{
saveInteger(pref->WindowWidth);
saveInteger(pref->WindowHeight);
...
saveString(pref->documentPath);
}
При добавлении в структуру нового поля, придётся дополнять эту функцию.
Если же вместо переменной подобной структуры использовать ассоциативный массив – всё что потребуется функции сохранения – перед началом работы сформировать список ключей этого массива и в цикле по списку ключей, сохранить каждый элемент, основываясь на его типе.
Это могло бы выглядеть так:
bool savePreferences(ass_arr* pref)
{
int i;
Variant v;
// цикл по всем элементам
for (i = 0; i < pref->Count(); i++)
{
// извлекаем очередной элемент
v = (*pref)[pref->key(i)].v()
// если элемент числового типа,
// сохраняем его числовое значение
if (VarType(v) == varInteger)
{
saveInteger((*pref)[pref->key(i)].asInteger());
}
// далее для других типов
...
}
}
Как быть, если нужно заполнить данными настроек Builder'овскую форму? Потребуется ещё одна функция. При использовании ассоциативных массивов эту процедуру можно автоматизировать.
А главное: при добавлении в массив настроек нового поля – не нужно ничего менять.
Существует ещё много подобных задач. Ассоциативные массивы – универсальное средство. Но как реализовать их в C++?
Реализация ассоциативных массивов в C++ Builder
Для реализации класса ассоциативного массива, я использовал несколько стандартных классов: во-первых, Variant – мультитип. В переменной типа Variant может хранится значение любого из стандартных типов. Во-вторых, CList – для создания
Похожие работы
Интересная статья: Основы написания курсовой работы

(Назад)
(Cкачать работу)