Can the order in associative array change when keys are not midified?

H. S. Teoh via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jan 1 09:34:27 PST 2015


On Thu, Jan 01, 2015 at 04:17:39PM +0000, Idan Arye via Digitalmars-d-learn wrote:
[...]
> My use case is that I have a large AA where the values are numbers and
> the keys are strings, and I need to send it over network again and
> again. The values constantly change but the keys should remain the
> same(after an initial initialization process), so I don't want to
> always have to send the keys, which compose the larger part of the
> AA's size. If the order is fixed as long as the keys are fixed I can
> cache the keys order and send only the values(without having to sort
> them each time).

It's risky to rely on the order of values returned by an AA. It's
implementation-dependent. Although currently we don't see any reason for
ever changing the order, that doesn't guarantee that a future
implementation with a new, innovative lookup algorithm, won't change it,
since the spec says that AA's are inherently unordered.

If you need consistent ordering of values, you probably want a different
data structure, like an ordered map, instead of an AA. Alternatively,
you can implement your own wrapper around the built-in AA's that keeps
track of insertion order, something like this:

	struct MyAA(K,V) {
		static struct WrappedValue {
			WrappedValue* next;
			V value;
			alias value this;
		}
		private WrappedValue[K] impl;
		WrappedValue* first;

		void opIndexAssign(V value, K key) {
			auto val = WrappedValue(value);
			val.next = first;
			impl[key] = val;
			first = &impl[key];
		}

		ref V opIndex(K key) {
			return impl[key].value;
		}

		@property auto byValue() {
			static struct Range {
				WrappedValue* current;
				@property bool empty() {
					return current is null;
				}
				@property auto front() {
					return current.value;
				}
				void popFront() {
					current = current.next;
				}
			}
			return Range(first);
		}

		... // other AA methods here
	}

Some care would have to be taken care of if you need to support deleting
AA keys (you have to relink stuff, so potentially you want a
doubly-linked list instead of a singly-linked list here). But basically,
something along these lines should give you an AA-like container that
guarantees iteration order no matter what the underlying AA
implementation is.


T

-- 
"No, John.  I want formats that are actually useful, rather than over-featured megaliths that address all questions by piling on ridiculous internal links in forms which are hideously over-complex." -- Simon St. Laurent on xml-dev


More information about the Digitalmars-d-learn mailing list