Создание массива пустых массивов в Ada

#arrays #ada #arrayofarrays

#массивы #ada #массив массивов

Вопрос:

Я пытаюсь написать Ada-эквивалент следующего оператора на Python: L = [[] для i в диапазоне (n)]

Я решаю задачу динамического программирования, и мой план состоит в том, чтобы в конечном итоге скопировать содержимое j-го массива внутри L в i-й массив (j < i), если в i-м массиве меньше элементов, чем в j-м массиве.

Я нашел, как создать пустой массив, определив его диапазон в обратном порядке. Так, например, arr2 был бы пустым массивом, созданным следующим образом:

arr2: массив (2 .. 1) целых чисел;

Мой вопрос в том, как мне определить больший массив L, чтобы включить n таких массивов arr2?

Пожалуйста, дайте мне знать.

Обновление: я смог заставить его правильно работать, используя ответы ниже. Вот мой код.

 package Integer_Vectors is new Ada.Containers.Vectors
    (Index_Type   => Natural,
    Element_Type => Integer);

    N: Integer;

    Array_Of_Vectors : array(1 .. N) of Integer_Vectors.Vector := (others => Integer_Vectors.Empty_Vector);

    Input_Sequence: Integer_Vectors.Vector;

    Max: Integer_Vectors.Vector;

    Input_List : String := Get_Line;

    IntCast : Integer;

    Last : Positive := 1;
    
    begin

    while Last < Input_List'Last loop
        Get(Input_List(Last..Input_List'Last),IntCast,Last);
        Input_Sequence.Append(IntCast);
        Last := Last   1;
    end loop;
    
    N := 0;

    for i of Input_Sequence loop
        N := N   1;
    end loop;
  

Комментарии:

1. В Ada вы можете определить пользовательские типы: type Arr2_Type is array(2 .. 1) of Integer . Затем у вас могут быть массивы вашего пользовательского типа (и так далее …). Но, вероятно, вы не хотите, чтобы массивы «Arr2» оставались пустыми. Тогда вы предпочтете использовать векторы (они являются расширяемыми) вместо массивов (они имеют фиксированный размер) в этом случае.

Ответ №1:

В Ada L будет

 L : array (1 .. N, 1 .. 0) of Integer;
  

Но это бесполезно, потому что вы не сможете расширить его позже. @Zerte прав.

Например, вы можете использовать вектор для неопределенных элементов. Вот так

 with Ada.Containers.Indefinite_Vectors;

type Integer_Array is array (Positive range <>) of Integer;

Empty : constant Integer_Array := (1 .. 0 => <>);

package Integer_Array_Vectors is new
 Ada.Containers.Indefinite_Vectors
   (Index_Type => Positive, Element_Type => Integer_Array);

L : Integer_Array_Vectors.Vector;

L.Append (Empty, N);

if L (J)'Length > L (I)'Length then
   L.Replace_Element (I, L(J));
end if;
  

Комментарии:

1. Использование неопределенных векторов здесь кажется мне излишним. n, размер L, известен и фиксирован: L — это массив. Массивы в L имеют различную длину: они являются векторами. Векторы могут использоваться внутри массива. Другим решением может быть L : array(1 .. n) of Integer_Vectors.Vector := (others => Integer_Vectors.Empty_Vector);

2. @Maxim, спасибо за ваше предложение. К сожалению, L.Append(Empty, N) выдал мне ожидаемую ошибку объявления.

3. @Yellowjacket11 объявление чего? Из того, что я вижу, N не объявлено…