Ce que vous voulez (sans recourir à Boost), c'est ce que j'appelle un "hash ordonné", qui est essentiellement un mashup d'un hachage et d'une liste chaînée avec des clés de chaîne ou de nombre entier (ou les deux en même temps). Un hachage ordonné maintient l'ordre des éléments lors de l'itération avec la performance absolue d'un hachage.
J'ai mis en place une bibliothèque d'extraits de code C ++ relativement nouvelle qui remplit ce que je considère comme des trous dans le langage C ++ pour les développeurs de bibliothèques C ++. Va ici:
https://github.com/cubiclesoft/cross-platform-cpp
Saisir:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
Si les données contrôlées par l'utilisateur sont placées dans le hachage, vous pouvez également souhaiter:
security/security_csprng.cpp
security/security_csprng.h
Invoquez-le:
#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();
}
Je suis tombé sur ce fil SO lors de ma phase de recherche pour voir si quelque chose comme OrderedHash existait déjà sans me demander de déposer dans une bibliothèque massive. J'étais déçu. Alors j'ai écrit le mien. Et maintenant je l'ai partagé.