3 votes

Conteneur de clés-valeurs C++ avec un nombre variable de clés

Y a-t-il un conteneur bien connu (dans boost par exemple) qui fournit un accès à la même valeur en utilisant différentes clés du même type. Toutes les clés sont uniques. Chaque valeur peut avoir un nombre variable de clés.

Voici une implémentation très naïve:

class multi_key_map
{
    std::unordered_map flatMap;

public:
    multi_key_map(std::initializer_list, std::string>> map)
    {
        for (auto& kvp : map)
        {
            for (auto&& key : kvp.first)
            {
                flatMap.emplace(std::move(key), kvp.second);
            }
        }
    }

    const std::string& operator[](std::string& key) const
    {
      return flatMap.at(key);
    }
};

const multi_key_map vals =
{ 
    { { "k1", "k2", "k3" }, "val1" },
    { { "k4", "k5" }, "val2" },
    { { "k6" }, "val3" }
};

assert(vals["k1"] == "val1");
assert(vals["k2"] == "val1");
assert(vals["k4"] == "val2");

Mais je ne veux pas réinventer la roue. J'ai examiné boost.multiindex mais je ne trouve pas la solution simple souhaitée avec un nombre variable de clés. Et il semble que boost.multiindex a été développé pour d'autres fins que les miennes.

4voto

Sam Varshavchik Points 2563

Si les valeurs sont simples, ou de petits types, insérer la même valeur pour toutes ses clés, dans un std::map ou un std::multimap devrait fonctionner très bien.

Pour des objets plus compliqués, ou s'il y a un besoin spécifique pour que plusieurs clés réfèrent au même objet distinct, utilisez un std::map ou un std::multimap avec des valeurs std::shared_ptr, en insérant le même std::shared_ptr pour toutes les clés de l'objet. De cette manière, toutes les clés finiront par faire référence à la même instance de l'objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X