![]() |
PIP 5.5.3
Platform-Independent Primitives
|
Различные классы контейнеров Подробнее...
Файлы | |
| файл | picontainers.h |
| Базовые макросы для контейнеров | |
| файл | pideque.h |
| Объявление PIDeque. | |
| файл | pimap.h |
| Объявление PIMap. | |
| файл | pipair.h |
| Объявление PIPair. | |
| файл | piqueue.h |
| Объявление PIQueue. | |
| файл | pistack.h |
| Объявление PIStack. | |
| файл | pivector.h |
| Объявление PIVector. | |
Классы | |
| class | PIDeque< T > |
| Последовательный двухсторонний контейнер с линейной памятью - динамический массив любого типа. Подробнее... | |
| class | PIMap< Key, T > |
| Словарь. Подробнее... | |
| class | PIMapIteratorConst< Key, T > |
| Итератор Java стиля для PIMap. Подробнее... | |
| class | PIMapIteratorConstReverse< Key, T > |
| Итератор Java стиля для PIMap в обратном порядке. Подробнее... | |
| class | PIMapIterator< Key, T > |
| Итератор Java стиля для PIMap. Подробнее... | |
| class | PIMapIteratorReverse< Key, T > |
| Итератор Java стиля для PIMap в обратном порядке. Подробнее... | |
| class | PIPair< Type0, Type1 > |
| Класс, который позволяет хранить два разнородных объекта как единое целое. Подробнее... | |
| class | PIQueue< T > |
| Класс контейнера наследованый от PIDeque с функциональностью очереди. Подробнее... | |
| class | PIStack< T > |
| Класс контейнера наследованый от PIVector с функциональностью стека. Подробнее... | |
| class | PIVector< T > |
| Последовательный контейнер с линейной памятью - динамический массив любого типа. Подробнее... | |
Различные классы контейнеров
| Класс | Описание |
|---|---|
| PIVector | Линейный массив, быстрое добавление в конец |
| PIDeque | Линейный массив, быстрое добавление вначало и конец |
| PIMap | Массив ключ/значение, словарь |
| PISet | Множество |
| PIStack | Стек |
| PIQueue | Очередь |
| PIPair | Пара |
| PIVector2D | Линейный двумерный прямоугольный массив |
Они совместимы с базовыми алгоритмами Qt и STL и оптимизированы по скорости.
Для каждого контейнерного класса есть два типа итераторов в стиле STL: один из них предоставляет доступ только для чтения, а другой - доступ для чтения-записи. Итераторы только для чтения должны использоваться везде, где это только возможно, так как они быстрее, чем итераторы для чтения-записи. Итератор только для чтения - const_iterator. Итератор для чтения-записи - iterator.
API итераторов в стиле STL сделан по образцу указателей в массиве. Например, оператор ++ перемещает итератор к следующему элементу, а оператор * возвращает элемент, на который позиционирован итератор. Тип iterator - это как typedef для T *, а тип const_iterator - как typedef для const T *. Итераторы в стиле STL указывают непосредственно на элемент. Функция контейнера begin() возвращает итератор, указывающий на первый элемент контейнера. Функция контейнера end() возвращает итератор, указывающий на воображаемый элемент, находящийся в позиции, следующей за последним элементом контейнера. end() обозначает несуществующую позицию; он никогда не должен разыменовываться. Обычно, он используется, как условие выхода из цикла.
Например:
Если список пуст, то begin() равен end(), поэтому цикл никогда не выполнится.
В следующей таблице подводится итог API итераторов в стиле STL:
| Выражение | Поведение |
|---|---|
*i | Возвращает текущий элемент |
++i | Перемещает итератор к следующему элементу |
i += n | Перемещает итератор вперед на n элементов |
--i | Перемещает итератор на один элемент назад |
i -= n | Перемещает итератор назад на n элементов |
i - j | Возвращает количество элементов, находящихся между итераторами i и j |
Оба оператора ++ и -- могут использоваться и как префиксные (++i, --i) и как постфиксные (i++, i--) операторы. Префиксная версия изменяет итератор, и возвращает ссылку на измененный итератор; постфиксная версия, берет копию итератора перед его изменением, и возвращает эту копию. В выражениях, в которых возвращаемое значение игнорируется, мы рекомендуем использовать префиксную версию (++i, --i), так как она несколько быстрее.
Для неконстантных итераторов, возвращаемое значение унарного оператора * может быть использовано с левой стороны от оператора присваивания.
Иван Пелипенко peri4.nosp@m.ko@y.nosp@m.andex.nosp@m..ru; Андрей Бычков work..nosp@m.a.b@.nosp@m.yande.nosp@m.x.ru;