O que você deseja (sem recorrer ao Boost) é o que chamo de "hash ordenado", que é essencialmente um mashup de um hash e uma lista vinculada com strings ou chaves inteiras (ou ambos ao mesmo tempo). Um hash ordenado mantém a ordem dos elementos durante a iteração com o desempenho absoluto de um hash.
Tenho reunido uma biblioteca de snippet C ++ relativamente nova que preenche o que considero lacunas na linguagem C ++ para desenvolvedores de bibliotecas C ++. Vá aqui:
https://github.com/cubiclesoft/cross-platform-cpp
Agarrar:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
Se os dados controlados pelo usuário forem colocados no hash, você também pode querer:
security/security_csprng.cpp
security/security_csprng.h
Invoque-o:
#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();
}
Corri para este segmento SO durante minha fase de pesquisa para ver se algo como OrderedHash já existia sem exigir que eu colocasse em uma biblioteca enorme. Fiquei desapontado. Então eu escrevi meu próprio. E agora eu compartilhei isso.