PIP 5.6.1
Platform-Independent Primitives
Файлы | Классы | Функции
Containers

Классы контейнеров и связанные вспомогательные сущности Подробнее...

Файлы

файл  picontainers.h
 Базовые макросы для контейнеров
 
файл  picontainersmodule.h
 Общий заголовок модуля Containers.
 
файл  pideque.h
 Объявление PIDeque.
 
файл  pimap.h
 Объявление PIMap.
 
файл  pipair.h
 Объявление PIPair.
 
файл  piqueue.h
 Объявление PIQueue.
 
файл  piset.h
 Объявление PISet.
 
файл  pistack.h
 Объявление PIStack.
 
файл  pivector.h
 Объявление PIVector.
 
файл  pivector2d.h
 Объявление PIVector2D.
 

Классы

class  PIVector2D< T >
 Двумерный контейнер-массив. Подробнее...
 
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  PISet< T >
 Множество уникальных значений. Подробнее...
 
class  PIStack< T >
 Класс контейнера наследованый от PIVector с функциональностью стека. Подробнее...
 
class  PIVector< T >
 Последовательный контейнер с линейной памятью - динамический массив любого типа. Подробнее...
 

Функции

template<typename T >
PICout operator<< (PICout s, const PIVector2D< T > &v)
 Оператор вывода PIVector2D в PICout.
 
template<typename T >
PICout operator<< (PICout s, const PIVector2D< T > &v)
 Оператор вывода PIVector2D в PICout.
 

Подробное описание

Классы контейнеров и связанные вспомогательные сущности

Сборка с использованием CMake

find_package(PIP REQUIRED)
target_link_libraries([target] PIP)

Состав

Класс Описание
PIVector Линейный массив, быстрое добавление в конец
PIDeque Линейный массив, быстрое добавление вначало и конец
PIMap Массив ключ/значение, словарь
PISet Множество
PIStack Стек
PIQueue Очередь
PIPair Пара
PIVector2D Линейный двумерный прямоугольный массив

Итераторы в стиле STL

Они совместимы с базовыми алгоритмами Qt и STL и оптимизированы по скорости.

Для каждого контейнерного класса есть два типа итераторов в стиле STL: один из них предоставляет доступ только для чтения, а другой - доступ для чтения-записи. Итераторы только для чтения должны использоваться везде, где это только возможно, так как они быстрее, чем итераторы для чтения-записи. Итератор только для чтения - const_iterator. Итератор для чтения-записи - iterator.

API итераторов в стиле STL сделан по образцу указателей в массиве. Например, оператор ++ перемещает итератор к следующему элементу, а оператор * возвращает элемент, на который позиционирован итератор. Тип iterator - это как typedef для T *, а тип const_iterator - как typedef для const T *. Итераторы в стиле STL указывают непосредственно на элемент. Функция контейнера begin() возвращает итератор, указывающий на первый элемент контейнера. Функция контейнера end() возвращает итератор, указывающий на воображаемый элемент, находящийся в позиции, следующей за последним элементом контейнера. end() обозначает несуществующую позицию; он никогда не должен разыменовываться. Обычно, он используется, как условие выхода из цикла.

Например:

for (PIVector<int>::const_iterator i = v.begin(); i != v.end(); ++i) piCout << *i;
std::for_each(v.begin(), v.end(), [](int n){std::cout << n << ' ';});
Последовательный контейнер с линейной памятью - динамический массив любого типа.
Definition: pivector.h:118
iterator begin()
Итератор на первый элемент.
Definition: pivector.h:553
#define piCout
Definition: picout.h:36

Если список пуст, то begin() равен end(), поэтому цикл никогда не выполнится.

итераторы

В следующей таблице подводится итог API итераторов в стиле STL:

Выражение Поведение
*i Возвращает текущий элемент
++i Перемещает итератор к следующему элементу
i += n Перемещает итератор вперед на n элементов
--i Перемещает итератор на один элемент назад
i -= n Перемещает итератор назад на n элементов
i - j Возвращает количество элементов, находящихся между итераторами i и j

Оба оператора ++ и -- могут использоваться и как префиксные (++i, --i) и как постфиксные (i++, i--) операторы. Префиксная версия изменяет итератор, и возвращает ссылку на измененный итератор; постфиксная версия, берет копию итератора перед его изменением, и возвращает эту копию. В выражениях, в которых возвращаемое значение игнорируется, мы рекомендуем использовать префиксную версию (++i, --i), так как она несколько быстрее.

Для неконстантных итераторов, возвращаемое значение унарного оператора * может быть использовано с левой стороны от оператора присваивания.