Removing entries from AAs

Steven Schveighoffer schveiguy at yahoo.com
Fri Aug 19 05:43:13 PDT 2011


On Fri, 19 Aug 2011 08:28:59 -0400, Timon Gehr <timon.gehr at gmx.ch> wrote:

> 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.
>

Note that dcollections http://www.dsource.org/project/dcollections  
supports removal of the currently iterated element during iteration.

See here:

http://www.dsource.org/projects/dcollections/browser/branches/d2/concepts.txt#L81

Sorry for the lack of D2 documentation, I really need to give some TLC to  
dcollections...

-Steve


More information about the Digitalmars-d-learn mailing list