สิ่งที่คุณต้องการ (โดยไม่ต้องใช้ Boost) คือสิ่งที่ฉันเรียกว่า "แฮชที่สั่งซื้อ" ซึ่งโดยพื้นฐานแล้วเป็นการผสมของแฮชและรายการที่เชื่อมโยงกับสตริงหรือคีย์จำนวนเต็ม (หรือทั้งสองอย่างพร้อมกัน) แฮชที่ได้รับคำสั่งจะรักษาลำดับขององค์ประกอบในระหว่างการทำซ้ำด้วยประสิทธิภาพที่แท้จริงของแฮช
ฉันได้รวบรวมไลบรารีข้อมูลโค้ด C ++ ที่ค่อนข้างใหม่ซึ่งเติมเต็มสิ่งที่ฉันมองว่าเป็นช่องโหว่ในภาษา C ++ สำหรับนักพัฒนาไลบรารี C ++ มานี่:
https://github.com/cubiclesoft/cross-platform-cpp
คว้า:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
หากข้อมูลที่ผู้ใช้ควบคุมจะถูกวางลงในแฮชคุณอาจต้องการ:
security/security_csprng.cpp
security/security_csprng.h
เรียกมัน:
#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();
}
ฉันพบเธรด SO นี้ในระหว่างขั้นตอนการวิจัยของฉันเพื่อดูว่ามีอะไรเช่น OrderHash อยู่แล้วหรือไม่โดยไม่ต้องให้ฉันเข้าไปในห้องสมุดขนาดใหญ่ ฉันรู้สึกผิดหวัง. เลยเขียนของตัวเอง และตอนนี้ฉันได้แบ่งปันแล้ว