İstediğiniz şey (Boost'a başvurmadan) benim "sıralı karma" olarak adlandırdığım şeydir, bu esasen bir karma ve dizge veya tamsayı anahtarları (veya aynı anda her ikisi) içeren bağlantılı bir listenin bir karışımıdır. Sıralı bir hash, bir hash'in mutlak performansıyla yineleme sırasında öğelerin sırasını korur.
C ++ kitaplık geliştiricileri için C ++ dilinde delikler olarak gördüğüm şeyleri dolduran nispeten yeni bir C ++ snippet kitaplığı oluşturuyorum. Buraya gidin:
https://github.com/cubiclesoft/cross-platform-cpp
Kapmak:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
Kullanıcı kontrollü veriler karmaya yerleştirilecekse, şunları da isteyebilirsiniz:
security/security_csprng.cpp
security/security_csprng.h
Çağır:
#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();
}
Bu SO iş parçacığına araştırma aşamam sırasında, OrderedHash gibi bir şeyin büyük bir kütüphaneye girmeme gerek kalmadan zaten var olup olmadığını görmek için karşılaştım. Hayal kırıklığına uğramıştım. Ben de kendim yazdım. Ve şimdi bunu paylaştım.