带有可变键计数的C ++键值容器

时间:2016-11-01 10:35:28

标签: c++ boost containers

是否有一些众所周知的容器(例如在boost中),它使用相同类型的不同键提供对相同值的访问。所有钥匙都是独一无二每个值可能具有可变键数。

这是非常天真的实施:

class multi_key_map
{
    std::unordered_map<std::string, std::string> flatMap;

public:
    multi_key_map(std::initializer_list<std::pair<std::vector<std::string>, 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");

但我不想重新发明轮子。我看了boost.multiindex,但我找不到具有可变键计数的理想简单解决方案。而且似乎boost.multiindex是为了我以外的目的而开发的。

1 个答案:

答案 0 :(得分:4)

如果值很简单或类型较小,则将所有键的相同值插入std::mapstd::multimap应该可以正常工作。

对于更复杂的对象,或者如果某些特定需要多个键来引用同一个不同的对象,请使用std::mapstd::multimap std::shared_ptr<value_class>值,插入相同的std::shared_ptr表示所有对象值的键。通过这种方式,所有键将最终引用对象的同一实例。