Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

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

From 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.
214 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.

×