Lo que quieres (sin recurrir a Boost) es lo que yo llamo un "hash ordenado", que es esencialmente un mashup de un hash y una lista vinculada con claves de cadena o enteras (o ambas al mismo tiempo). Un hash ordenado mantiene el orden de los elementos durante la iteración con el rendimiento absoluto de un hash.
He estado armando una biblioteca de fragmentos de C ++ relativamente nueva que llena lo que veo como agujeros en el lenguaje C ++ para los desarrolladores de bibliotecas de C ++. Ven aquí:
https://github.com/cubiclesoft/cross-platform-cpp
Agarrar:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
Si los datos controlados por el usuario se colocarán en el hash, es posible que también desee:
security/security_csprng.cpp
security/security_csprng.h
Invocarlo:
#include "templates/detachable_ordered_hash.h"
...
// The 47 is the nearest prime to a power of two
// that is close to your data size.
//
// If your brain hurts, just use the lookup table
// in 'detachable_ordered_hash.cpp'.
//
// If you don't care about some minimal memory thrashing,
// just use a value of 3. It'll auto-resize itself.
int y;
CubicleSoft::OrderedHash<int> TempHash(47);
// If you need a secure hash (many hashes are vulnerable
// to DoS attacks), pass in two randomly selected 64-bit
// integer keys. Construct with CSPRNG.
// CubicleSoft::OrderedHash<int> TempHash(47, Key1, Key2);
CubicleSoft::OrderedHashNode<int> *Node;
...
// Push() for string keys takes a pointer to the string,
// its length, and the value to store. The new node is
// pushed onto the end of the linked list and wherever it
// goes in the hash.
y = 80;
TempHash.Push("key1", 5, y++);
TempHash.Push("key22", 6, y++);
TempHash.Push("key3", 5, y++);
// Adding an integer key into the same hash just for kicks.
TempHash.Push(12345, y++);
...
// Finding a node and modifying its value.
Node = TempHash.Find("key1", 5);
Node->Value = y++;
...
Node = TempHash.FirstList();
while (Node != NULL)
{
if (Node->GetStrKey()) printf("%s => %d\n", Node->GetStrKey(), Node->Value);
else printf("%d => %d\n", (int)Node->GetIntKey(), Node->Value);
Node = Node->NextList();
}
Me encontré con este hilo de SO durante mi fase de investigación para ver si ya existía algo como OrderedHash sin que tuviera que colocar una biblioteca masiva. Estaba decepcionado. Así que escribí el mío. Y ahora lo he compartido.