Removing entries from AAs
useo6
unknown at unknown.com
Fri Aug 19 05:41:30 PDT 2011
== Auszug aus Timon Gehr (timon.gehr at gmx.ch)'s Artikel
> On 08/19/2011 02:01 PM, useo6 wrote:
> > Hi,
> >
> > I've create a little example of my problem:
> >
> > module example;
> >
> > class ExampleClass {
> >
> > public {
> >
> > int mi;
> >
> > this(int i) {
> > mi = i;
> > }
> >
> > }
> >
> > }
> >
> > int main(string[] args) {
> >
> > ExampleClass[hash_t] exp;
> >
> > ExampleClass cex = new ExampleClass(1);
> > exp[cex.toHash()] = cex;
> >
> > cex = new ExampleClass(2);
> > exp[cex.toHash()] = cex;
> >
> > cex = new ExampleClass(3);
> > exp[cex.toHash()] = cex;
> >
> > foreach (ExampleClass c; exp) {
> > if (c.mi == 2) {exp.remove(c.toHash()); }
> > }
> >
> > return 0;
> >
> > }
> >
> > When I run this small example-app, I get an "Access Violation".
When
> > I insert a break into my foreach-loop like:
> >
> > foreach (ExampleClass c; exp) {
> > if (c.mi == 2) {exp.remove(c.toHash()); break; }
> > }
> >
> > it works, but this means, I leave the foreach-loop. What I'm doing
> > wrong by using the foreach-block?
> >
> > Thanks for any help!
> The problem is that you change the AA while iterating over it. You
could
> eg iterate over it and save all keys you want to remove into an
array
> and then iterate over the array to remove the keys from the AA.
> This works:
> module example;
> class ExampleClass {
> public {
> int mi;
> this(int i) {
> mi = i;
> }
> }
> }
> int main(string[] args) {
> ExampleClass[hash_t] exp;
> ExampleClass cex = new ExampleClass(1);
> exp[cex.toHash()] = cex;
> cex = new ExampleClass(2);
> exp[cex.toHash()] = cex;
> cex = new ExampleClass(3);
> exp[cex.toHash()] = cex;
> hash_t[] toRemove;
> foreach (c; exp) {
> if (c.mi == 2) { toRemove~=c.toHash(); }
> }
> foreach (h; toRemove) {
> exp.remove(h);
> }
> return 0;
> }
I already thought about that situation, but some explained the
removing/clearing of an array by iterate over each element and remove
it from the AA. I just solved the problem by using the HashSet-class
from the dcollection's.
More information about the Digitalmars-d-learn
mailing list