【发布时间】:2016-11-01 10:35:28
【问题描述】:
是否有一些众所周知的容器(例如在 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 是为我以外的目的而开发的。
【问题讨论】:
-
为什么不能做 reverse ?将 "val"s 附加到 "k"s 的向量上?
-
使用
std::tuple或std::set作为键怎么样? -
@P0W,现在它完全按照您的建议在生产代码中实现。但是有点脏。例如,我们需要不必要的 for 循环等。
-
@πάντα ῥεῖ,我需要通过每个键分别访问值,而不是通过键包
-
为什么不进行两次查找?键-> packofkeyshash-> 值?所以你的 operator[] 会做
return valuemap[packofkeys[key]];
标签: c++ boost containers