Dynamic array as stack and GC.BlkAttr.APPENDABLE
IgorStepanov via Digitalmars-d
digitalmars-d at puremagic.com
Fri Nov 14 15:12:04 PST 2014
On Friday, 14 November 2014 at 22:38:53 UTC, Steven Schveighoffer
wrote:
> On 11/14/14 5:25 PM, Dmitry Olshansky wrote:
>> 15-Nov-2014 01:16, IgorStepanov пишет:
>>> Recently I encountered the following problem.
>>> I need a simple stack of uint.
>>> I want to push uints back and pop it. I don't want to copy
>>> this stack
>>> and I want it to work fast.
>>>
>>> In a first approximation, the problem seems easy.
>>>
>>> uint[] my_stack;
>>> my_stack.reserve(256);
>>>
>>> my_stack ~= 1; //push
>>> uint head = my_stack[$ - 1]; //top
>>> my_stack.length--; //pop
>>
>> Just make push into:
>>
>> my_stack.assumeSafeAppend();
>> my_stack ~= value;
>>
>> To avoid relocations.
>>
>
> In actuality, you do not need this before every push. You only
> need it between a pop and a push.
>
> I highly recommend not doing arrays-as-stacks, because you end
> up writing your own type.
I'm working on AssociativeArray implementation and I need to
array which contains indices of free entries (entries is an array
which contain Entry objects. When we need to find empty Entry to
add a new value to the AA, we are getting the first element of
the stack. (If the stack is empty, we need to add new element to
entries). If entry has been removed from AA, it index is added to
the stack).
Thus I don't want to add extra fields, and this stack is an
encapsulated entity.
More information about the Digitalmars-d
mailing list