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