Предположим, у нас есть структура данных, которая является картой значения ключа, где сам ключ снова является картой значения ключа.Например:
map<map<string,string>>, string>
Теперь предположим, что мы хотим запросить все ключи / значения верхнего уровня на этой карте, соответствующие определенному подмножеству значений ключа ключа.Пример:
map = { { "k1" : "v1", "k2 : "v2" } : "value1",
{ "k1" : "v3", "k2 : "v4" } : "value2",
{ "k1" : "v1", "k2 : "v5" } : "value3"
}
И наш запрос «дайте мне все значения ключа, где ключ содержит { "k1" : "v1" }
, и он будет возвращать первое и третье значение. Аналогично, запрос для { "k1" : "v3", "k2" : "v4" }
вернет все ключи-значения, которые имеют как k1=v3
, так и k2=v4
, что дает второе значение. Очевидно, что мы можем выполнять поиск по полной карте для каждого запроса, но я ищу что-то более эффективное, чем это.
Я посмотрелвокруг, но не может найти эффективное, простое в использовании решение для C ++. Boost multi_index, похоже, не обладает такой гибкостью при запросе подмножеств пар ключ-значение.
В некоторых базах данных естьспособы создания индексов, которые могут отвечать именно на такие запросы. Например, у Postgres есть индексы GIN (обобщенные инвертированные индексы), которые позволяют вам спрашивать
SELECT * FROM table WHERE some_json_column @> '{"k1":"v1","k2":"v2"}'
-- returns all rows that have both k1=v1 and k2=v2
Однако я ищу решение без баз данныхтолько в C ++. Есть ли какая-либо библиотека или структура данных, которая может выполнить что-то вроде этого? В случае, если нет, некоторые указатели напользовательская реализация?