Simon Wright
2015-04-19 20:27:50 UTC
I need to remove some of the elements from a vector, depending on the
element. I have the code below, which works for GNAT, but which seems
distinctly dodgy; in particular, it fails if the last Element is
negative and therefore gets deleted.
The Booch Components have
procedure Delete_Item_At (It : in out Iterator) is abstract;
(an Iterator is very similar to a Cursor) which is defined to leave the
Iterator designating the 'next' Element (i.e., the one, is any, you
would have reached by applying Next to the original Iterator). But I
don't see any such promise for the Containers.
Is there a proper idiom for doing this job? Should I maybe go over the
Vector in reverse order and use the version of Delete that uses the
index?
with Ada.Containers.Vectors;
with Ada.Text_IO; use Ada.Text_IO;
procedure Deleting_From_Queue is
package Vectors is new Ada.Containers.Vectors (Positive, Integer);
V : Vectors.Vector;
begin
V.Append (1);
V.Append (-1);
V.Append (2);
V.Append (-2);
V.Append (3);
declare
C : Vectors.Cursor := V.First;
D : Vectors.Cursor;
use type Vectors.Cursor;
begin
while C /= Vectors.No_Element loop
if Vectors.Element (C) < 0 then
Put_Line ("deleting element " & Vectors.Element (C)'Img);
D := C;
V.Delete (D); -- D -> No_Element
else
Put_Line ("skipping element " & Vectors.Element (C)'Img);
Vectors.Next (C);
end if;
end loop;
end;
Put_Line ("length now " & V.Length'Img);
end Deleting_From_Queue;
element. I have the code below, which works for GNAT, but which seems
distinctly dodgy; in particular, it fails if the last Element is
negative and therefore gets deleted.
The Booch Components have
procedure Delete_Item_At (It : in out Iterator) is abstract;
(an Iterator is very similar to a Cursor) which is defined to leave the
Iterator designating the 'next' Element (i.e., the one, is any, you
would have reached by applying Next to the original Iterator). But I
don't see any such promise for the Containers.
Is there a proper idiom for doing this job? Should I maybe go over the
Vector in reverse order and use the version of Delete that uses the
index?
with Ada.Containers.Vectors;
with Ada.Text_IO; use Ada.Text_IO;
procedure Deleting_From_Queue is
package Vectors is new Ada.Containers.Vectors (Positive, Integer);
V : Vectors.Vector;
begin
V.Append (1);
V.Append (-1);
V.Append (2);
V.Append (-2);
V.Append (3);
declare
C : Vectors.Cursor := V.First;
D : Vectors.Cursor;
use type Vectors.Cursor;
begin
while C /= Vectors.No_Element loop
if Vectors.Element (C) < 0 then
Put_Line ("deleting element " & Vectors.Element (C)'Img);
D := C;
V.Delete (D); -- D -> No_Element
else
Put_Line ("skipping element " & Vectors.Element (C)'Img);
Vectors.Next (C);
end if;
end loop;
end;
Put_Line ("length now " & V.Length'Img);
end Deleting_From_Queue;