是否有一些众所周知的容器(例如在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是为了我以外的目的而开发的。
答案 0 :(得分:4)
如果值很简单或类型较小,则将所有键的相同值插入std::map
或std::multimap
应该可以正常工作。
对于更复杂的对象,或者如果某些特定需要多个键来引用同一个不同的对象,请使用std::map
或std::multimap
std::shared_ptr<value_class>
值,插入相同的std::shared_ptr
表示所有对象值的键。通过这种方式,所有键将最终引用对象的同一实例。