comp.lang.ada
 help / color / mirror / Atom feed
From: Jeffrey Carter <spam.jrcarter.not@spam.not.acm.org>
Subject: Re: Deleting elements from a Vector
Date: Sun, 19 Apr 2015 14:07:27 -0700
Date: 2015-04-19T14:07:27-07:00	[thread overview]
Message-ID: <mh15cl$bj$1@dont-email.me> (raw)
In-Reply-To: <lywq173ltl.fsf@pushface.org>

On 04/19/2015 01:27 PM, Simon Wright wrote:
> 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.
> 
> 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;

Seems to me that in the general case a cursor becomes invalid after the element
it designates is deleted from the container through another cursor. For most
such containers I'd think doing Next on the cursor before the Delete would work.
However, since a Vector is an unbounded array, the cursor may just be an index,
in which case that wouldn't work. I'd advise always using a Vector as if it were
an array, and iterate over it using indices.

-- 
Jeff Carter
"He didn't get that nose from playing ping-pong."
Never Give a Sucker an Even Break
110

  reply	other threads:[~2015-04-19 21:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-19 20:27 Deleting elements from a Vector Simon Wright
2015-04-19 21:07 ` Jeffrey Carter [this message]
2015-04-19 21:12 ` Niklas Holsti
2015-04-20  7:56   ` Simon Wright
2015-04-20  8:39     ` Georg Bauhaus
2015-04-20 11:13       ` Simon Wright
2015-04-20  7:36 ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox