Những gì bạn muốn (mà không cần dùng đến Boost) là những gì tôi gọi là "băm có thứ tự", về cơ bản là một bản trộn của một băm và một danh sách được liên kết với chuỗi hoặc khóa số nguyên (hoặc cả hai cùng một lúc). Hàm băm có thứ tự duy trì thứ tự của các phần tử trong quá trình lặp lại với hiệu suất tuyệt đối của một hàm băm.
Tôi đã tập hợp một thư viện đoạn mã C ++ tương đối mới để lấp đầy những gì tôi xem là lỗ hổng trong ngôn ngữ C ++ dành cho các nhà phát triển thư viện C ++. Đến đây:
https://github.com/cubiclesoft/cross-platform-cpp
Vồ lấy:
templates/detachable_ordered_hash.cpp
templates/detachable_ordered_hash.h
templates/detachable_ordered_hash_util.h
Nếu dữ liệu do người dùng kiểm soát sẽ được đưa vào hàm băm, bạn cũng có thể muốn:
security/security_csprng.cpp
security/security_csprng.h
Gọi nó:
#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();
}
Tôi đã chạy vào chuỗi SO này trong giai đoạn nghiên cứu của mình để xem liệu bất kỳ thứ gì giống như OrderedHash đã tồn tại mà không yêu cầu tôi phải thả vào một thư viện khổng lồ hay không. Tôi đã thất vọng. Vì vậy, tôi đã viết của riêng tôi. Và bây giờ tôi đã chia sẻ nó.