Lo que quiere (sin recurrir a Boost) es lo que llamo un "hash pedido", que es esencialmente un mashup de un hash y una lista vinculada con cadenas o enteros (o ambos 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 recopilando una biblioteca de fragmentos de C++ relativamente nueva que completa lo que veo como agujeros en el lenguaje C++ para los desarrolladores de bibliotecas C++. Vaya aquí:
https://github.com/cubiclesoft/cross-platform-cpp
Grab:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
Si los datos controlados por el usuario serán colocados en la tabla hash, también puede que quiera:
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 SO durante mi fase de investigación para ver si ya existía algo así como OrderedHash sin necesidad de incluir una biblioteca masiva. Estaba decepcionado. Así que escribí el mío. Y ahora lo he compartido.
Bueno, parte del rápido tiempo de búsqueda para std :: map tiene que ver con el hecho de que está ordenado en orden, por lo que puede hacer una búsqueda binaria. ¡No puedo tener tu torta y comerla también! – bobobobo
¿Qué terminaste usando en ese entonces? – aggsol