Инициализация std :: map с общими значениями без дублирования - PullRequest
0 голосов
/ 23 октября 2018

Я хочу создать статическую карту отношений, известную во время компиляции:

{
    {k11, v1}, {k12, v1}, {k13, v1}, ...
    {k21, v2}, {k22, v2}, {k23, v2}, ...
    ...
    {kn1, vn}, {kn2, vn}, {kn3, vn}, ...
}

Это может включать в себя множество пар ключ-значение в строке, и поэтому я бы предпочел написать так:

{
    {v1, {k11, k12, k13, ...}},
    {v2, {k21, k22, k23, ...}},
    ...
    {vn, {kn1, kn2, kn3, ...}}
}

Какой самый простой (самый читаемый) способ добиться этого?

1 Ответ

0 голосов
/ 23 октября 2018

Одно решение, о котором я могу подумать, - это использовать следующую функцию:

#include <vector>
#include <tuple>
#include <map>
template <typename TValue, typename TKey>
std::map<TKey, TValue> reverse_map(
        std::vector<std::tuple<TValue, std::vector<TKey> > > const & relations){

    std::map<TKey, TValue> res;
    for (auto const & value_keys : relations){
        for(auto const & key : std::get<1u>(value_keys))
            res[key] = std::get<0u>(value_keys);
    }
    return res;
}

Я не уверен, как выполнение такой функции влияет на время работы.Я был бы рад услышать, если у кого-то есть понимание этого или лучшие решения.

...