Справочное руководство по Ada 2005
A.18.2 Пакет Containers.Vectors
Определяемый языком обобщённый пакет Containers.Vectors предоставляет закрытые типы Vector и Cursor, а также набор операций для каждого типа. Контейнер типа вектор позволяет вставлять и удалять элементы в любой позиции, но он оптимизирован для вставки и удаления в конце контейнера (то есть, в позиции с максимальным индексом). Контейнер типа вектор также обеспечивает произвольный доступ к элементам.
Контейнер типа вектор по концепции ведет себя как массив, который расширяется по мере необходимости при вставке элементов. Длина вектора — это количество элементов, содержащихся в векторе. Ёмкость вектора — это максимальное количество элементов, которые могут быть вставлены в вектор до его автоматического расширения.
Элементы в контейнере типа вектор могут быть упомянуты по значению индекса определённого типа. Первый элемент вектора всегда имеет значение индекса, равное нижней границе формального типа.
Контейнер типа вектор может содержать пустые элементы. Пустые элементы не имеют заданного значения.
Статическая семантика
Обобщённый пакет библиотек Containers.Vectors имеет следующую декларацию:
generic
type Index_Type is range <>;
type Element_Type is private;
with function "=" (Left, Right : Element_Type)
return Boolean is <>;
package Ada.Containers.Vectors is
pragma Preelaborate(Vectors);
type Index_Type is range <>;
type Element_Type is private;
with function "=" (Left, Right : Element_Type)
return Boolean is <>;
package Ada.Containers.Vectors is
pragma Preelaborate(Vectors);
subtype Extended_Index is
Index_Type'Base range
Index_Type'First-1 ..
Index_Type'Min (Index_Type'Base'Last - 1, Index_Type'Last) + 1;
No_Index : constant Extended_Index := Extended_Index'First;
Index_Type'Base range
Index_Type'First-1 ..
Index_Type'Min (Index_Type'Base'Last - 1, Index_Type'Last) + 1;
No_Index : constant Extended_Index := Extended_Index'First;
type Vector is tagged private;
pragma Preelaborable_Initialization(Vector);
pragma Preelaborable_Initialization(Vector);
type Cursor is private;
pragma Preelaborable_Initialization(Cursor);
pragma Preelaborable_Initialization(Cursor);
Empty_Vector : constant Vector;
No_Element : constant Cursor;
function "=" (Left, Right : Vector) return Boolean;
function To_Vector (Length : Count_Type) return Vector;
function To_Vector
(New_Item : Element_Type;
Length : Count_Type) return Vector;
(New_Item : Element_Type;
Length : Count_Type) return Vector;
function "&" (Left, Right : Vector) return Vector;
function "&" (Left : Vector;
Right : Element_Type) return Vector;
Right : Element_Type) return Vector;
function "&" (Left : Element_Type;
Right : Vector) return Vector;
Right : Vector) return Vector;
function "&" (Left, Right : Element_Type) return Vector;
function Capacity (Container : Vector) return Count_Type;
procedure Reserve_Capacity (Container : in out Vector;
Capacity : in Count_Type);
Capacity : in Count_Type);
function Length (Container : Vector) return Count_Type;
procedure Set_Length (Container : in out Vector;
Length : in Count_Type);
Length : in Count_Type);
function Is_Empty (Container : Vector) return Boolean;
procedure Clear (Container : in out Vector);
function To_Cursor (Container : Vector;
Index : Extended_Index) return Cursor;
Index : Extended_Index) return Cursor;
function To_Index (Position : Cursor) return Extended_Index;
function Element (Container : Vector;
Index : Index_Type)
return Element_Type;
Index : Index_Type)
return Element_Type;
function Element (Position : Cursor) return Element_Type;
procedure Replace_Element (Container : in out Vector;
Index : in Index_Type;
New_Item : in Element_Type);
Index : in Index_Type;
New_Item : in Element_Type);
procedure Replace_Element (Container : in out Vector;
Position : in Cursor;
New_item : in Element_Type);
Position : in Cursor;
New_item : in Element_Type);
procedure Query_Element
(Container : in Vector;
Index : in Index_Type;
Process : not null access procedure (Element : in Element_Type));
(Container : in Vector;
Index : in Index_Type;
Process : not null access procedure (Element : in Element_Type));
procedure Query_Element
(Position : in Cursor;
Process : not null access procedure (Element : in Element_Type));
(Position : in Cursor;
Process : not null access procedure (Element : in Element_Type));
procedure Update_Element
(Container : in out Vector;
Index : in Index_Type;
Process : not null access procedure
(Element : in out Element_Type));
(Container : in out Vector;
Index : in Index_Type;
Process : not null access procedure
(Element : in out Element_Type));
procedure Update_Element
(Container : in out Vector;
Position : in Cursor;
Process : not null access procedure
(Element : in out Element_Type));
(Container : in out Vector;
Position : in Cursor;
Process : not null access procedure
(Element : in out Element_Type));
procedure Move (Target : in out Vector;
Source : in out Vector);
Source : in out Vector);
procedure Insert (Container : in out Vector;
Before : in Extended_Index;
New_Item : in Vector);
Before : in Extended_Index;
New_Item : in Vector);
procedure Insert (Container : in out Vector;
Before : in Cursor;
New_Item : in Vector);
Before : in Cursor;
New_Item : in Vector);
procedure Insert (Container : in out Vector;
Before : in Cursor;
New_Item : in Vector;
Position : out Cursor);
Before : in Cursor;
New_Item : in Vector;
Position : out Cursor);
procedure Insert (Container : in out Vector;
Before : in Extended_Index;
New_Item : in Element_Type;
Count : in Count_Type := 1);
Before : in Extended_Index;
New_Item : in Element_Type;
Count : in Count_Type := 1);
procedure Insert (Container : in out Vector;
Before : in Cursor;
New_Item : in Element_Type;
Count : in Count_Type := 1);
Before : in Cursor;
New_Item : in Element_Type;
Count : in Count_Type := 1);
procedure Insert (Container : in out Vector;
Before : in Cursor;
New_Item : in Element_Type;
Position : out Cursor;
Count : in Count_Type := 1);
Before : in Cursor;
New_Item : in Element_Type;
Position : out Cursor;
Count : in Count_Type := 1);
procedure Insert (Container : in out Vector;
Before : in Extended_Index;
Count : in Count_Type := 1);
Before : in Extended_Index;
Count : in Count_Type := 1);
procedure Insert (Container : in out Vector;
Before : in Cursor;
Position : out Cursor;
Count : in Count_Type := 1);
Before : in Cursor;
Position : out Cursor;
Count : in Count_Type := 1);
procedure Prepend (Container : in out Vector;
New_Item : in Vector);
New_Item : in Vector);
procedure Prepend (Container : in out Vector;
New_Item : in Element_Type;
Count : in Count_Type := 1);
New_Item : in Element_Type;
Count : in Count_Type := 1);
procedure Append (Container : in out Vector;
New_Item : in Vector);
New_Item : in Vector);
procedure Append (Container : in out Vector;
New_Item : in Element_Type;
Count : in Count_Type := 1);
New_Item : in Element_Type;
Count : in Count_Type := 1);
procedure Insert_Space (Container : in out Vector;
Before : in Extended_Index;
Count : in Count_Type := 1);
Before : in Extended_Index;
Count : in Count_Type := 1);
procedure Insert_Space (Container : in out Vector;
Before : in Cursor;
Position : out Cursor;
Count : in Count_Type := 1);
Before : in Cursor;
Position : out Cursor;
Count : in Count_Type := 1);
procedure Delete (Container : in out Vector;
Index : in Extended_Index;
Count : in Count_Type := 1);
Index : in Extended_Index;
Count : in Count_Type := 1);
procedure Delete (Container : in out Vector;
Position : in out Cursor;
Count : in Count_Type := 1);
Position : in out Cursor;
Count : in Count_Type := 1);
procedure Delete_First (Container : in out Vector;
Count : in Count_Type := 1);
Count : in Count_Type := 1);
procedure Delete_Last (Container : in out Vector;
Count : in Count_Type := 1);
Count : in Count_Type := 1);
procedure Reverse_Elements (Container : in out Vector);
procedure Swap (Container : in out Vector;
I, J : in Index_Type);
I, J : in Index_Type);
procedure Swap (Container : in out Vector;
I, J : in Cursor);
I, J : in Cursor);
function First_Index (Container : Vector) return Index_Type;
function First (Container : Vector) return Cursor;
function First_Element (Container : Vector)
return Element_Type;
return Element_Type;
function Last_Index (Container : Vector) return Extended_Index;
function Last (Container : Vector) return Cursor;
function Last_Element (Container : Vector)
return Element_Type;
return Element_Type;
function Next (Position : Cursor) return Cursor;
procedure Next (Position : in out Cursor);
function Previous (Position : Cursor) return Cursor;
procedure Previous (Position : in out Cursor);
function Find_Index (Container : Vector;
Item : Element_Type;
Index : Index_Type := Index_Type'First)
return Extended_Index;
Item : Element_Type;
Index : Index_Type := Index_Type'First)
return Extended_Index;
function Find (Container : Vector;
Item : Element_Type;
Position : Cursor := No_Element)
return Cursor;
Item : Element_Type;
Position : Cursor := No_Element)
return Cursor;
function Reverse_Find_Index (Container : Vector;
Item : Element_Type;
Index : Index_Type := Index_Type'Last)
return Extended_Index;
Item : Element_Type;
Index : Index_Type := Index_Type'Last)
return Extended_Index;
function Reverse_Find (Container : Vector;
Item : Element_Type;
Position : Cursor := No_Element)
return Cursor;
Item : Element_Type;
Position : Cursor := No_Element)
return Cursor;
function Contains (Container : Vector;
Item : Element_Type) return Boolean;
Item : Element_Type) return Boolean;
function Has_Element (Position : Cursor) return Boolean;
procedure Iterate
(Container : in Vector;
Process : not null access procedure (Position : in Cursor));
(Container : in Vector;
Process : not null access procedure (Position : in Cursor));
procedure Reverse_Iterate
(Container : in Vector;
Process : not null access procedure (Position : in Cursor));
(Container : in Vector;
Process : not null access procedure (Position : in Cursor));
generic
with function "<" (Left, Right : Element_Type)
return Boolean is <>;
package Generic_Sorting is
with function "<" (Left, Right : Element_Type)
return Boolean is <>;
package Generic_Sorting is
function Is_Sorted (Container : Vector) return Boolean;
procedure Sort (Container : in out Vector);
procedure Merge (Target : in out Vector;
Source : in out Vector);
Source : in out Vector);
end Generic_Sorting;
END_OF_DOCUMENT_MARKER private
... -- не задано языком
end Ada.Containers.Vectors;
Ожидается, что фактическая функция для порождаемой формальной функции «=» по значениям Element_Type определит рефлексивное и симметричное отношение и каждый раз при вызове с конкретной парой значений вернет то же значение результата. Если она ведет себя иным образом, функции, определенные для ее использования, возвращают неопределенное значение. Точные аргументы и количество вызовов этой порождаемой формальной функции функциями, определенными для ее использования, не определены.
Тип Vector используется для представления векторов. Тип Vector требует финализации (см. 7.6).
Empty_Vector представляет собой пустой объект вектора. Его длина равна 0. Если объект типа Vector не инициализирован иным образом, он инициализируется тем же значением, что и Empty_Vector.
No_Element представляет собой курсор, не обозначающий никакого элемента. Если объект типа Cursor не инициализирован иным образом, он инициализируется тем же значением, что и No_Element.
Предустановленный оператор «=» для типа Cursor возвращает True, если оба курсора являются No_Element или обозначают один и тот же элемент в одном и том же контейнере.
Выполнение стандартной реализации атрибутов Input, Output, Read или Write типа Cursor вызывает Program_Error.
No_Index представляет позицию, которая не соответствует ни одному элементу. Подтип Extended_Index включает индексы, охватываемые Index_Type, плюс значение No_Index и, если оно существует, преемник Index_Type'Last.
Некоторые операции этого обобщенного пакета имеют параметры доступа к подпрограммам. Для обеспечения корректности таких операций они защищают от определенных действий указанной подпрограммой. В частности, некоторые операции проверяют «вмешательство в курсоры» контейнера, так как они зависят от того, чтобы набор элементов контейнера оставался постоянным, а другие проверяют «вмешательство в элементы» контейнера, так как они зависят от того, чтобы элементы контейнера не заменялись.
Говорят, что подпрограмма вмешивается в курсоры объекта вектора V, если:
- она вставляет или удаляет элементы V, то есть вызывает процедуры Insert, Insert_Space, Clear, Delete или Set_Length с V в качестве параметра; или
- она выполняет финализацию V; или
- она вызывает процедуру Move с V в качестве параметра.
Говорят, что подпрограмма вмешивается в элементы объекта вектора V, если:
- она вмешивается в курсоры V; или
- она заменяет один или несколько элементов V, то есть вызывает процедуры Replace_Element, Reverse_Elements или Swap, или процедуры Sort или Merge экземпляра Generic_Sorting с V в качестве параметра.
function "=" (Left, Right : Vector) return Boolean;
Если Left и Right обозначают один и тот же объект вектора, то функция возвращает True. Если Left и Right имеют различную длину, то функция возвращает False. В противном случае она сравнивает каждый элемент в Left с соответствующим элементом в Right, используя обобщенный формальный оператор равенства. Если какое-либо такое сравнение возвращает False, функция возвращает False; в противном случае она возвращает True. Любое исключение, возникшее во время оценки равенства элементов, распространяется.
function To_Vector (Length : Count_Type) return Vector;
Возвращает вектор длины Length, заполненный пустыми элементами.
function To_Vector
(New_Item : Element_Type;
Length : Count_Type) return Vector;
(New_Item : Element_Type;
Length : Count_Type) return Vector;
Возвращает вектор длины Length, заполненный элементами, инициализированными значением New_Item.
function "&" (Left, Right : Vector) return Vector;
Возвращает вектор, содержащий элементы Left, за которыми следуют элементы Right.
function "&" (Left : Vector;
Right : Element_Type) return Vector;
Right : Element_Type) return Vector;
Возвращает вектор, содержащий элементы Left, за которыми следует элемент Right.
function "&" (Left : Element_Type;
Right : Vector) return Vector;
Right : Vector) return Vector;
Возвращает вектор, содержащий элемент Left, за которым следуют элементы Right.
function "&" (Left, Right : Element_Type) return Vector;
Возвращает вектор, содержащий элемент Left, за которым следует элемент Right.
function Capacity (Container : Vector) return Count_Type;
Возвращает емкость контейнера Container.
procedure Reserve_Capacity (Container : in out Vector;
Capacity : in Count_Type);
Capacity : in Count_Type);
Reserve_Capacity выделяет новые внутренние структуры данных таким образом, чтобы длина результирующего вектора могла достичь хотя бы значения Capacity без дополнительного вызова Reserve_Capacity и достаточно велика, чтобы вместить текущую длину Container. Затем Reserve_Capacity копирует элементы в новые структуры данных и освобождает старые структуры данных. Любое исключение, возникающее при выделении, распространяется, а Container не изменяется.
function Length (Container : Vector) return Count_Type;
Возвращает количество элементов в контейнере Container.
procedure Set_Length (Container : in out Vector;
Length : in Count_Type);
Length : in Count_Type);
Если Length больше емкости Container, Set_Length вызывает Reserve_Capacity (Container, Length), затем устанавливает длину Container в Length. Если Length больше исходной длины Container, к Container добавляются пустые элементы; в противном случае элементы удаляются из Container.
function Is_Empty (Container : Vector) return Boolean;
Эквивалентно Length (Container) = 0.
procedure Clear (Container : in out Vector);
Удаляет все элементы из Container. Емкость Container не меняется.
function To_Cursor (Container : Vector;
Index : Extended_Index) return Cursor;
Index : Extended_Index) return Cursor;
Если Index не входит в диапазон First_Index (Container) .. Last_Index (Container), то возвращается No_Element. В противном случае возвращается курсор, обозначающий элемент в позиции Index в Container.
function To_Index (Position : Cursor) return Extended_Index;
Если Position равно No_Element, возвращается No_Index. В противном случае возвращается индекс (в своем содержащем векторе) элемента, обозначенного Position.
function Element (Container : Vector;
Index : Index_Type)
return Element_Type;
Index : Index_Type)
return Element_Type;
Если Index не входит в диапазон First_Index (Container) .. Last_Index (Container), то возникает Constraint_Error. В противном случае Element возвращает элемент в позиции Index.
function Element (Position : Cursor) return Element_Type;
Если Position равно No_Element, то возникает Constraint_Error. В противном случае Element возвращает элемент, обозначенный Position.
procedure Replace_Element (Container : in out Vector;
Index : in Index_Type;
New_Item : in Element_Type);
Index : in Index_Type;
New_Item : in Element_Type);
Если Index не входит в диапазон First_Index (Container) .. Last_Index (Container), то возникает Constraint_Error. В противном случае Replace_Element присваивает значение New_Item элементу в позиции Index. Любое исключение, возникшее во время присваивания, распространяется. Элемент в позиции Index не является пустым элементом после успешного вызова Replace_Element.
procedure Replace_Element (Container : in out Vector;
Position : in Cursor;
New_Item : in Element_Type);
Position : in Cursor;
New_Item : in Element_Type);
Если Position равно No_Element, то возникает Constraint_Error; если Position не обозначает элемент в Container, то возникает Program_Error. В противном случае Replace_Element присваивает New_Item элементу, обозначенному Position. Любое исключение, возникшее во время присваивания, распространяется. Элемент в позиции Position не является пустым элементом после успешного вызова Replace_Element.
procedure Query_Element
(Container : in Vector;
Index : in Index_Type;
Process : not null access procedure (Element : in Element_Type));
(Container : in Vector;
Index : in Index_Type;
Process : not null access procedure (Element : in Element_Type));
Если Index не входит в диапазон First_Index (Container) .. Last_Index (Container), то возникает Constraint_Error. В противном случае Query_Element вызывает Process.all с элементом в позиции Index в качестве аргумента. Program_Error распространяется, если Process.all вмешивается в элементы Container. Любое исключение, возникшее в Process.all, распространяется.
procedure Query_Element
(Position : in Cursor;
Process : not null access procedure (Element : in Element_Type));
(Position : in Cursor;
Process : not null access procedure (Element : in Element_Type));
Если Position равно No_Element, то возникает Constraint_Error. В противном случае Query_Element вызывает Process.all с элементом, обозначенным Position, в качестве аргумента. Program_Error распространяется, если Process.all вмешивается в элементы Container. Любое исключение, возникшее в Process.all, распространяется.
procedure Update_Element
(Container : in out Vector;
Index : in Index_Type;
Process : not null access procedure (Element : in out Element_Type));
(Container : in out Vector;
Index : in Index_Type;
Process : not null access procedure (Element : in out Element_Type));
Если индекс не находится в диапазоне First_Index (Контейнер) .. Last_Index (Контейнер), то возникает Constraint_Error. В противном случае, Update_Element вызывает Process.all с элементом в позиции Index в качестве аргумента. Program_Error возникает, если Process.all изменяет элементы Контейнера. Любое исключение, возбуждённое Process.all, передаётся вверх.
Если Element_Type не ограничен и определён, то фактический параметр Element в Process.all должен быть неограниченным.
Элемент в позиции Index не является пустым элементом после успешного выполнения этой операции.
процедура Update_Element
(Контейнер : in out Вектор;
Позиция : in Курсор;
Процесс : not null access процедура (Элемент : in out Тип_Элемента));
(Контейнер : in out Вектор;
Позиция : in Курсор;
Процесс : not null access процедура (Элемент : in out Тип_Элемента));
Если Позиция равна No_Element, то возникает Constraint_Error; если Позиция не указывает на элемент в Контейнере, то возникает Program_Error. В противном случае Update_Element вызывает Process.all с элементом, указанным Позицией, в качестве аргумента. Program_Error возникает, если Process.all изменяет элементы Контейнера. Любое исключение, возбуждённое Process.all, передаётся вверх.
Если Element_Type не ограничен и определён, то фактический параметр Element в Process.all должен быть неограниченным.
Элемент, указанный Позицией, не является пустым элементом после успешного выполнения этой операции.
процедура Move (Целевой : in out Вектор;
Источник : in out Вектор);
Источник : in out Вектор);
Если Целевой обозначает тот же объект, что и Источник, то Move не оказывает никакого влияния. В противном случае Move сначала вызывает Clear (Целевой); затем каждый элемент из Источника удаляется из Источника и вставляется в Целевой в исходном порядке. Длина Источника равна 0 после успешного вызова Move.
процедура Insert (Контейнер : in out Вектор;
Перед : in Расширенный_Индекс;
Новый_Элемент : in Вектор);
Перед : in Расширенный_Индекс;
Новый_Элемент : in Вектор);
Если Перед не находится в диапазоне First_Index (Контейнер) .. Last_Index (Контейнер) + 1, то возникает Constraint_Error. Если Length(Новый_Элемент) равно 0, то Insert ничего не делает. В противном случае, вычисляется новая длина NL как сумма текущей длины и Length (Новый_Элемент); если значение Last, соответствующее длине NL, будет больше, чем Index_Type'Last, то возникает Constraint_Error.
Если текущая ёмкость вектора меньше, чем NL, вызывается Reserve_Capacity (Контейнер, NL) для увеличения ёмкости вектора. Затем Insert сдвигает элементы в диапазоне Перед .. Last_Index (Контейнер) вверх на Length(Новый_Элемент) позиций, а затем копирует элементы Новый_Элемент в позиции, начиная с Перед. Любое исключение, возбуждённое во время копирования, передаётся вверх.
процедура Insert (Контейнер : in out Вектор;
Перед : in Курсор;
Новый_Элемент : in Вектор);
Перед : in Курсор;
Новый_Элемент : in Вектор);
Если Перед не равно No_Element и не указывает на элемент в Контейнере, то возникает Program_Error. В противном случае, если Length(Новый_Элемент) равно 0, то Insert ничего не делает. Если Перед равно No_Element, то вызов эквивалентен Insert (Контейнер, Last_Index (Контейнер) + 1, Новый_Элемент); в противном случае вызов эквивалентен Insert (Контейнер, To_Index (Перед), Новый_Элемент);
процедура Insert (Контейнер : in out Вектор;
Перед : in Курсор;
Новый_Элемент : in Вектор;
Позиция : out Курсор);
Перед : in Курсор;
Новый_Элемент : in Вектор;
Позиция : out Курсор);
Если Перед не равно No_Element и не указывает на элемент в Контейнере, то возникает Program_Error. Если Перед равно No_Element, то пусть T будет Last_Index (Контейнер) + 1; в противном случае пусть T будет To_Index (Перед). Вызывается Insert (Контейнер, T, Новый_Элемент), а затем Позиция устанавливается в To_Cursor (Контейнер, T).
процедура Insert (Контейнер : in out Вектор;
Перед : in Расширенный_Индекс;
Новый_Элемент : in Тип_Элемента;
Счёт : in Тип_Счёта := 1);
Перед : in Расширенный_Индекс;
Новый_Элемент : in Тип_Элемента;
Счёт : in Тип_Счёта := 1);
Эквивалентно Insert (Контейнер, Перед, To_Вектор (Новый_Элемент, Счёт));
процедура Insert (Контейнер : in out Вектор;
Перед : in Курсор;
Новый_Элемент : in Тип_Элемента;
Счёт : in Тип_Счёта := 1);
Перед : in Курсор;
Новый_Элемент : in Тип_Элемента;
Счёт : in Тип_Счёта := 1);
Эквивалентно Insert (Контейнер, Перед, To_Вектор (Новый_Элемент, Счёт));
процедура Insert (Контейнер : in out Вектор;
Перед : in Курсор;
Новый_Элемент : in Тип_Элемента;
Позиция : out Курсор;
Счёт : in Тип_Счёта := 1);
Перед : in Курсор;
Новый_Элемент : in Тип_Элемента;
Позиция : out Курсор;
Счёт : in Тип_Счёта := 1);
Эквивалентно Insert (Контейнер, Перед, To_Вектор (Новый_Элемент, Счёт), Позиция);
процедура Insert (Контейнер : in out Вектор;
Перед : in Расширенный_Индекс;
Счёт : in Тип_Счёта := 1);
Перед : in Расширенный_Индекс;
Счёт : in Тип_Счёта := 1);
Если Перед не находится в диапазоне First_Index (Контейнер) .. Last_Index (Контейнер) + 1, то возникает Constraint_Error. Если Счёт равен 0, то Insert ничего не делает. В противном случае, вычисляется новая длина NL как сумма текущей длины и Счёт; если значение Last, соответствующее длине NL, будет больше, чем Index_Type'Last, то возникает Constraint_Error.
Если текущая ёмкость вектора меньше, чем NL, вызывается Reserve_Capacity (Контейнер, NL) для увеличения ёмкости вектора. Затем Insert сдвигает элементы в диапазоне Перед .. Last_Index (Контейнер) вверх на Счёт позиций, а затем вставляет элементы, инициализированные по умолчанию (см. 3.3.1) в позиции, начиная с Перед.
процедура Insert (Контейнер : in out Вектор;
Перед : in Курсор;
Позиция : out Курсор;
Счёт : in Тип_Счёта := 1);
Перед : in Курсор;
Позиция : out Курсор;
Счёт : in Тип_Счёта := 1);
Если Before не является No_Element и не обозначает элемент в Container, то генерируется ошибка Program_Error. Если Before равно No_Element, то пусть T будет Last_Index (Container) + 1; в противном случае, пусть T будет To_Index (Before). Вызывается Insert (Container, T, Count), а затем Position устанавливается в To_Cursor (Container, T).
процедура Prepend (Container : ввод-вывод Vector;
New_Item : ввод Vector;
Count : ввод Count_Type := 1);
New_Item : ввод Vector;
Count : ввод Count_Type := 1);
Эквивалентно Insert (Container, First_Index (Container), New_Item).
процедура Prepend (Container : ввод-вывод Vector;
New_Item : ввод Element_Type;
Count : ввод Count_Type := 1);
New_Item : ввод Element_Type;
Count : ввод Count_Type := 1);
Эквивалентно Insert (Container, First_Index (Container), New_Item, Count).
процедура Append (Container : ввод-вывод Vector;
New_Item : ввод Vector);
New_Item : ввод Vector);
Эквивалентно Insert (Container, Last_Index (Container) + 1, New_Item).
процедура Append (Container : ввод-вывод Vector;
New_Item : ввод Element_Type;
Count : ввод Count_Type := 1);
New_Item : ввод Element_Type;
Count : ввод Count_Type := 1);
Эквивалентно Insert (Container, Last_Index (Container) + 1, New_Item, Count).
процедура Insert_Space (Container : ввод-вывод Vector;
Before : ввод Extended_Index;
Count : ввод Count_Type := 1);
Before : ввод Extended_Index;
Count : ввод Count_Type := 1);
Если Before не находится в диапазоне First_Index (Container) .. Last_Index (Container) + 1, то генерируется ошибка Constraint_Error. Если Count равно 0, то Insert_Space ничего не делает. В противном случае, она вычисляет новую длину NL как сумму текущей длины и Count; если значение Last, соответствующее длине NL, будет больше, чем Index_Type'Last, то генерируется ошибка Constraint_Error.
Если текущая емкость вектора меньше NL, вызывается Reserve_Capacity (Container, NL) для увеличения емкости вектора. Затем Insert_Space сдвигает элементы в диапазоне Before .. Last_Index (Container) вверх на Count позиций и вставляет пустые элементы в позиции, начиная с Before.
процедура Insert_Space (Container : ввод-вывод Vector;
Before : ввод Cursor;
Position : вывод Cursor;
Count : ввод Count_Type := 1);
Before : ввод Cursor;
Position : вывод Cursor;
Count : ввод Count_Type := 1);
Если Before не равно No_Element и не обозначает элемент в Container, то генерируется ошибка Program_Error. Если Before равно No_Element, то пусть T будет Last_Index (Container) + 1; в противном случае, пусть T будет To_Index (Before). Вызывается Insert_Space (Container, T, Count), а затем Position устанавливается в To_Cursor (Container, T).
процедура Delete (Container : ввод-вывод Vector;
Index : ввод Extended_Index;
Count : ввод Count_Type := 1);
Index : ввод Extended_Index;
Count : ввод Count_Type := 1);
Если Index не находится в диапазоне First_Index (Container) .. Last_Index (Container) + 1, то генерируется ошибка Constraint_Error. Если Count равно 0, Delete не оказывает никакого эффекта. В противном случае Delete сдвигает элементы (если таковые имеются), начиная с позиции Index + Count вниз до Index. Любая ошибка, возникшая во время присваивания элемента, передается дальше.
процедура Delete (Container : ввод-вывод Vector;
Position : ввод-вывод Cursor;
Count : ввод Count_Type := 1);
Position : ввод-вывод Cursor;
Count : ввод Count_Type := 1);
Если Position равно No_Element, то генерируется ошибка Constraint_Error. Если Position не обозначает элемент в Container, то генерируется ошибка Program_Error. В противном случае, вызывается Delete (Container, To_Index (Position), Count), а затем Position устанавливается в No_Element.
процедура Delete_First (Container : ввод-вывод Vector;
Count : ввод Count_Type := 1);
Count : ввод Count_Type := 1);
Эквивалентно Delete (Container, First_Index (Container), Count).
процедура Delete_Last (Container : ввод-вывод Vector;
Count : ввод Count_Type := 1);
Count : ввод Count_Type := 1);
Если Length (Container) <= Count, то Delete_Last эквивалентна Clear (Container). В противном случае она эквивалентна Delete (Container, Index_Type'Val(Index_Type'Pos(Last_Index (Container)) – Count + 1), Count).
процедура Reverse_Elements (Container : ввод-вывод List);
Переупорядочивает элементы Container в обратном порядке.
процедура Swap (Container : ввод-вывод Vector;
I, J : ввод Index_Type);
I, J : ввод Index_Type);
Если I или J не находятся в диапазоне First_Index (Container) .. Last_Index (Container), то возникает ошибка Constraint_Error. В противном случае, Swap меняет значения элементов в позициях I и J.
процедура Swap (Container : вход выход Vector;
I, J : вход Cursor);
I, J : вход Cursor);
Если I или J равны No_Element, то возникает ошибка Constraint_Error. Если I или J не обозначают элемент в Container, то возникает ошибка Program_Error. В противном случае, Swap меняет значения элементов, обозначенных I и J.
функция First_Index (Container : Vector) возвращает Index_Type;
Возвращает значение Index_Type'First.
функция First (Container : Vector) возвращает Cursor;
Если Container пуста, First возвращает No_Element. В противном случае, возвращает курсор, обозначающий первый элемент в Container.
функция First_Element (Container : Vector) возвращает Element_Type;
Эквивалентно Element (Container, First_Index (Container)).
функция Last_Index (Container : Vector) возвращает Extended_Index;
Если Container пуста, Last_Index возвращает No_Index. В противном случае, возвращает позицию последнего элемента в Container.
функция Last (Container : Vector) возвращает Cursor;
Если Container пуста, Last возвращает No_Element. В противном случае, возвращает курсор, обозначающий последний элемент в Container.
функция Last_Element (Container : Vector) возвращает Element_Type;
Эквивалентно Element (Container, Last_Index (Container)).
функция Next (Position : Cursor) возвращает Cursor;
Если Position равно No_Element или обозначает последний элемент контейнера, то Next возвращает No_Element. В противном случае, возвращает курсор, обозначающий элемент с индексом To_Index (Position) + 1 в том же векторе, что и Position.
процедура Next (Position : вход выход Cursor);
Эквивалентно Position := Next (Position).
функция Previous (Position : Cursor) возвращает Cursor;
Если Position равно No_Element или обозначает первый элемент контейнера, то Previous возвращает No_Element. В противном случае, возвращает курсор, обозначающий элемент с индексом To_Index (Position) – 1 в том же векторе, что и Position.
процедура Previous (Position : вход выход Cursor);
Эквивалентно Position := Previous (Position).
функция Find_Index (Container : Vector;
Item : Element_Type;
Index : Index_Type := Index_Type'First)
возвращает Extended_Index;
Item : Element_Type;
Index : Index_Type := Index_Type'First)
возвращает Extended_Index;
Ищет элементы в Container, равные Item (используя общий формальный оператор равенства). Поиск начинается с позиции Index и продолжается в направлении Last_Index (Container). Если такой элемент не найден, Find_Index возвращает No_Index. В противном случае возвращает индекс первого найденного совпадающего элемента.
функция Find (Container : Vector;
Item : Element_Type;
Position : Cursor := No_Element)
возвращает Cursor;
Item : Element_Type;
Position : Cursor := No_Element)
возвращает Cursor;
Если Position не равно No_Element и не обозначает элемент в Container, то возникает ошибка Program_Error. В противном случае Find ищет элементы в Container, равные Item (используя общий формальный оператор равенства). Поиск начинается с первого элемента, если Position равно No_Element, и с элемента, обозначенного Position в противном случае. Продолжается в направлении последнего элемента Container. Если совпадающий элемент не найден, то Find возвращает No_Element. В противном случае возвращает курсор, обозначающий первый найденный совпадающий элемент.
функция Reverse_Find_Index (Container : Vector;
Item : Element_Type;
Index : Index_Type := Index_Type'Last)
возвращает Extended_Index;
Item : Element_Type;
Index : Index_Type := Index_Type'Last)
возвращает Extended_Index;
Ищет элементы в Container, равные Item (используя общий формальный оператор равенства). Поиск начинается с позиции Index, или, если Index больше Last_Index (Container), с позиции Last_Index (Container). Продолжается в направлении First_Index (Container). Если такой элемент не найден, Reverse_Find_Index возвращает No_Index. В противном случае возвращает индекс первого найденного совпадающего элемента.
функция Reverse_Find (Container : Vector;
Item : Element_Type;
Position : Cursor := No_Element)
возвращает Cursor;
Item : Element_Type;
Position : Cursor := No_Element)
возвращает Cursor;
Если Position не равно No_Element и не обозначает элемент в Container, то возникает ошибка Program_Error. В противном случае Reverse_Find ищет элементы в Container, равные Item (используя общий формальный оператор равенства). Поиск начинается с последнего элемента, если Position равно No_Element, и с элемента, обозначенного Position в противном случае. Продолжается в направлении первого элемента Container. Если совпадающий элемент не найден, то Reverse_Find возвращает No_Element. В противном случае возвращает курсор, обозначающий первый найденный совпадающий элемент.
функция Contains (Container : Vector;
Item : Element_Type) возвращает Boolean;
Item : Element_Type) возвращает Boolean;
Эквивалентно Has_Element (Find (Container, Item)).
функция Has_Element (Position : Cursor) возвращает Boolean;
Возвращает True, если Position обозначает элемент, и False в противном случае.
процедура Iterate
(Container : вход Vector;
Process : не null доступ процедура (Position : вход Cursor));
(Container : вход Vector;
Process : не null доступ процедура (Position : вход Cursor));
Вызывает Process.all с курсором, обозначающим каждый элемент в Container в порядке индексов. Возникает Program_Error, если Process.all изменяет курсоры Container. Любая исключительная ситуация, поднятая Process, передается дальше.
процедура Reverse_Iterate
(Container : вход Vector;
Process : не null доступ процедура (Position : вход Cursor));
(Container : вход Vector;
Process : не null доступ процедура (Position : вход Cursor));
Итерируется по элементам в Container, как в Iterate, за исключением того, что элементы проходятся в обратном порядке индексов.
Ожидается, что фактическая функция для общего формального оператора "<" в Generic_Sorting будет возвращать одно и то же значение каждый раз, когда она вызывается с конкретной парой значений элементов. Она должна определять строгое отношение порядка, то есть быть нерефлексивной, несимметричной и транзитивной; она не должна изменять Container. Если фактическая функция "<" ведет себя иначе, поведение подпрограмм Generic_Sorting не определено. Количество вызовов подпрограммами Generic_Sorting оператора "<" не определено.
функция Is_Sorted (Container : Vector) возвращает Boolean;
Возвращает True, если элементы упорядочены по возрастанию, как определено общим формальным оператором "<"; в противном случае Is_Sorted возвращает False. Любая исключительная ситуация, поднятая во время вычисления "<", передаётся дальше.
процедура Sort (Container : вход выход Vector);
Переупорядочивает элементы Container так, чтобы они были упорядочены по возрастанию, как определено общим формальным оператором "<". Любая исключительная ситуация, поднятая во время вычисления "<", передаётся дальше.
процедура Merge (Target : вход выход Vector;
Source : вход выход Vector);
Source : вход выход Vector);
Merge удаляет элементы из Source и вставляет их в Target; после этого Target содержит объединение элементов, которые были изначально в Source и Target; Source остается пустой. Если Target и Source изначально были упорядочены по возрастанию, используя предоставленный общий формальный оператор "<", то Target упорядочивается по возрастанию; в противном случае порядок элементов в Target не определен. Любая исключительная ситуация, поднятая во время вычисления "<", передаётся дальше.
Ограниченные (временные) ошибки
Чтение значения пустого элемента с помощью вызова Element, Query_Element, Update_Element, Swap, Is_Sorted, Sort, Merge, "=", Find или Reverse_Find является ограниченной ошибкой. Реализация может обращаться к элементу как имеющему любое нормальное значение (см. 13.9.1) типа элемента или поднимать Constraint_Error или Program_Error до модификации вектора.
Вызов Merge в экземпляре Generic_Sorting, если Source или Target не упорядочены по возрастанию, используя предоставленный общий формальный оператор "<", является ограниченной ошибкой. Или Program_Error поднимается после обновления Target, как описано для Merge, или операция работает как определено.
Значение Cursor является неопределённым, если после его создания произошло одно из следующего:
- Для вектора, содержащего элемент, обозначенный курсором, были вызваны Insert, Insert_Space или Delete с индексом (или курсором, обозначающим элемент с таким индексом) меньше или равным индексу элемента, обозначенного курсором; или
- Вектор, содержащий элемент, обозначенный курсором, был передан в процедуры Sort или Merge экземпляра Generic_Sorting или в процедуру Reverse_Elements.
Вызов любой подпрограммы, кроме "=" или Has_Element, объявленной в Containers.Vectors, с неопределенным (но не некорректным, см. ниже) параметром cursor, является ограниченной ошибкой. Возможные результаты:
- Курсор может быть обработан как No_Element;
- Курсор может указывать на некоторый элемент в векторе (но не обязательно на тот, который он изначально обозначал);
- Может быть поднято Constraint_Error; или
- Может быть поднято Program_Error.
Ошибка выполнения
Значение Cursor является некорректным, если после его создания произошло одно из следующего:
- Вектор, содержащий элемент, обозначенный курсором, был окончательно закрыт;
- Вектор, содержащий элемент, на который он указывает, использовался в качестве Источника или Цели вызова Move; или
- Элемент, на который он указывает, был удален.
Результат операции "=" или Has_Element не определён, если она вызвана с недопустимым параметром курсора. Выполнение является ошибочным, если любая другая подпрограмма, объявленная в Containers.Vectors, вызвана с недопустимым параметром курсора.
Требования к реализации
Никакие данные, связанные с объектом вектора, не должны быть потеряны при присваивании или выходе из области видимости.
Выполнение assignment_statement для вектора должно иметь эффект копирования элементов из исходного объекта вектора в целевой объект вектора.
Рекомендации по реализации
Containers.Vectors должен быть реализован аналогично массиву. В частности, если длина вектора равна N, то
- худший случай сложности Element должен составлять O(log N);
- худший случай сложности Append с Count=1, когда N меньше, чем ёмкость вектора, должен составлять O(log N); и
- худший случай сложности Prepend с Count=1 и Delete_First с Count=1 должен составлять O(N log N).
Худший случай временной сложности вызова процедуры Sort экземпляра Containers.Vectors.Generic_Sorting должен составлять O(N**2), а средняя временная сложность должна быть лучше, чем O(N**2).
Containers.Vectors.Generic_Sorting.Sort и Containers.Vectors.Generic_Sorting.Merge должны минимизировать копирование элементов.
Move не должен копировать элементы и должен минимизировать копирование внутренних структур данных.
Если исключение распространяется из операции с вектором, никакие данные не должны быть потеряны, и никакие элементы не должны быть удалены из вектора, если это не указано операцией.
ПРИМЕЧАНИЯ
42 Все элементы вектора занимают места во внутреннем массиве. Если требуется контейнер с разреженными данными, следует использовать Hashed_Map вместо вектора.
43 Если Index_Type'Base'First = Index_Type'First, экземпляр Ada.Containers.Vectors сгенерирует исключение Constraint_Error. Требуется значение ниже Index_Type'First, чтобы пустой вектор имел осмысленное значение Last_Index.