Это одно из ограничений проектирования стандартных контейнеров: контейнер в некотором смысле «владеет» содержащимися данными и ожидает быть единственным владельцем ... контейнеры - это не просто «индексы».В вашем случае простое, но не на 100% эффективное решение - иметь две std :: maps с «Node *» в качестве значения и хранить оба ключа в структуре Node (так что каждый ключ хранится дважды).При таком подходе вы можете обновить свою структуру данных с разумными накладными расходами (вы будете выполнять дополнительный поиск по карте, но это должно быть достаточно быстро).
Возможно, «правильное» решение, однако IMO, будет выглядеть как
struct Node
{
Key key1;
Key key2;
Payload data;
Node *Collision1Prev, *Collision1Next;
Node *Collision2Prev, *Collision2Next;
};
в основном каждый узел находится в двух разных хеш-таблицах одновременно.
Стандартные контейнеры не могут быть объединены таким образом.Другими примерами, которые я кодировал вручную в прошлом, являются, например, хеш-таблица, где все узлы также находятся в двусвязном списке, или дерево, где все узлы также находятся в массиве.
Для очень сложных структур данных(например, сеть структур, каждая из которых является одновременно «владельцем» нескольких цепочек и частью нескольких других цепочек). Я даже иногда прибегал к генерации кода (т. е. к сценариям, которые генерируют правильный код обработки указателей с учетом описания структуры данных)..