×
Namespaces

Variants
Actions

Классы для организации коллекций

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Статья
Перевод:
Оригинал: Collection classes
Den123
Последнее редактирование: hamishwillee (08 Dec 2011)

По ряду причин, главным образом из-за обширности, Symbian не поддерживает Стандартную Библиотеку Шаблонов (STL). В Symbian представлены собственные реализации шаблонов для организации таких структур как массивы, связанные списки и т.д.

Классы CArray и RArray используются для создания динамических массивов. Для организации односвязанного списка используется TSglQue, для двусвязанного TDblQue. Для создания циклического буфера используется CCirBuf. Сбалансированное дерево можно реализовать с помощью TBtree.


Contents

Какие типы коллекций представлены ?

RArray-классы используются для организации плоских массивов. Поддерживают сортировку и поиск с помощью функции-компaратора. Позволяют проверять уникальность элементов. Имеются готовые реализации для часто используемых типов, например для TInt.

CArray-классы могут использовать плоскую или сегментированную структуру памяти для хранения элементов. Поддерживают сортировку и поиск с помощью функции-ключа. Могут проверять уникальность. Есть варианты для реализации массивов как постоянной, так и переменной длины. Поддерживают упаковку данных. Такие массивы обычно работают достаточно медленно - использование RArray-классов является предпочтительным.

Массивы дескрипторов - позволяют использовать плоскую или сегментированную структуру памяти для хранения элементов. Могут хранить 8- или 16-битные дескрипторы. Поддерживают сортировку, поиск и проверку на уникальность. Есть варианты, которые позволяют хранить как любые типы дескрипторов, так и только указатели на данные.

Связанные списки - поддерживают итераторы для сканирования списков. Представлены как односвязанные, так и двусвязанные варианты реализации.

Класс TFixedArray - используется, если количество элементов известно на момент компиляции, должен использоваться вместо обычных массивов C++ так как при доступе к элементам выполняет проверку выхода за пределы диапазона. TArray - используется для представления любых массивов в общем случае.

RArray и RPointerArray

RArray - это простой массив объектов (объекты должны быть одинакового размера). RPointerArray - соответственно, массив указателей на объекты. Для RArray предусмотрено следующее ограничение - размер элемента не должен превышать 640 байт. В большинстве случаев, используемые элементы массива имеют размер меньше этого значения, если это не так - нужно использовать RPointerArray. Благодаря высокой эффективности, гибкости и простоте использования, использование RArray является более предпочтительным, чем использование CArray.

RArray и RPointerArray обычно создаются в стеке либо могут принадлежать динамически создаваемым объектам. Эти классы используют ресурсы устройства - поэтому их необходимо закрывать в случае возникновения сброса. Для помещения в стек очистки нужно использовать метод CleanupClosePushL() вместо PushL().


Использование RArray

struct Networkdata
{
TBuf<10> LAC;
TBuf<15> CELLID;
};


// RArray элементов Networkdata.

RArray<data> DesArray;

// Заполнение структуры

struct Networkdata db;
db.LAC.Copy(_L("1121") );
db.CELLID.Copy(_L("152"));

// Добавление в массив

DesArray.Append( db );


Заполненный массив должен быть очищен при выходе за пределы области видимости (или при уничтожении объекта, которому этот массив принадлежит). И RArray и RPointerArray содержат метод Reset(), который освобождает память, используемую для хранения элементов.

DesArray.Reset();


CArray

Все массивы данного типа используют буферы для хранения данных. Буферы (наследуются от класса CBufBase) предоставляют доступ к регионам памяти и, в некотором роде, подобны дескрипторам. Однако, в отличие от дескрипторов, которые позволяют сохранять объекты, размер которых не должен активно изменяться, буферы могут динамично менять свои размеры во время выполнения. Существуют два типа буферов - плоские и сегментированные, соответственно, есть два типа CArray-массивов.

Плоские буферы хранят свои данные в единой ячейке памяти. Если эта ячейка памяти полностью заполнена, любая операция добавления выделяет новую ячейку памяти, способную вместить все имеющиеся элементы и вновь добавляемые. Как только новая ячейка памяти будет выделена в куче, все данные копируются в нее из старой ячейки, которая уничтожается (возвращается в глобальную кучу).

Сегментированные буферы сохраняют свои данные в двусвязанном списке. Каждый элемент списка - это небольшая отдельная ячейка памяти фиксированного размера. Как только все свободные ячейки списка буду заполнены, в динамической памяти выделяется новая ячейка, которая добавляется в список. Никакого копирования данных не происходит. Такой подход позволяет экономнее расходовать память (нет постоянного выделения и копирования больших участков памяти) и уменьшить фрагментирование памяти. Однако время доступа к элементам массива увеличивается, так как для получения элемента приходится "проходится" по списку. Расходуется больше памяти, так как каждый элемент должен сохранять указатели на следующий и предыдущий элементы списка.


Почему нужно использовать RArray вместо CArrayX ?

CArrayX использует для организации массива класс CBufBase, который позволяет хранить данные либо в плоской, либо в сегментированной структуре. Обычно, CBufBase работает непосредственно с массивом байт и для каждого доступа к данным создает объект класса TPtr8. Это заметно снижает производительность даже для массива, состоящего из элементов одинакового размера. Более того, при каждом обращении к элементам массива производится проверка переданных параметров с помощью как минимум двух утверждений даже в релизной версии.

This page was last modified on 8 December 2011, at 23:42.
44 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×