Apa yang Anda inginkan (tanpa menggunakan Boost) adalah apa yang saya sebut "hash yang dipesan", yang pada dasarnya adalah gabungan dari hash dan daftar tertaut dengan kunci string atau integer (atau keduanya pada saat yang sama). Hash terurut mempertahankan urutan elemen selama iterasi dengan kinerja hash yang absolut.
Saya telah menyusun pustaka cuplikan C ++ yang relatif baru yang mengisi apa yang saya lihat sebagai lubang dalam bahasa C ++ untuk pengembang pustaka C ++. Kesini:
https://github.com/cubiclesoft/cross-platform-cpp
Mengambil:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
Jika data yang dikontrol pengguna akan ditempatkan ke dalam hash, Anda mungkin juga ingin:
security/security_csprng.cpp
security/security_csprng.h
Panggil itu:
#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();
}
Saya menemukan utas SO ini selama fase penelitian saya untuk melihat apakah sesuatu seperti OrderedHash sudah ada tanpa mengharuskan saya untuk mampir di perpustakaan besar. Aku kecewa. Jadi saya menulis sendiri. Dan sekarang saya sudah membagikannya.