C++ C++;具有可变键计数的键值容器
是否有一些众所周知的容器(例如在boost中)使用相同类型的不同键提供对相同值的访问。所有键都是唯一的。每个值都可能有可变的键计数 下面是一个非常简单的实现:C++ C++;具有可变键计数的键值容器,c++,boost,containers,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:
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");
类多密钥映射
{
std::无序_图平面图;
公众:
多键映射(std::初始值设定项列表映射)
{
用于(自动和kvp:map)
{
用于(自动和键:kvp.first)
{
平面图安放(标准::移动(键),千伏秒);
}
}
}
常量std::字符串和运算符[](std::字符串和键)常量
{
返回flatMap.at(键);
}
};
常量多键映射VAL=
{
{{“k1”,“k2”,“k3”},“val1”},
{{“k4”,“k5”},“val2”},
{{“k6”},“val3”}
};
断言(VAL[“k1”]=“val1”);
断言(VAL[“k2”]=“val1”);
断言(VAL[“k4”]=“val2”);
但我不想重新发明轮子。我看了,但我找不到理想的简单解决方案与可变键计数。而且,boost.multiindex似乎是为我以外的目的而开发的。如果值是简单的,或者是小类型的,那么将其所有键的值插入
std::map
或std::multimap
应该可以正常工作
对于更复杂的对象,或者如果需要多个键引用同一个不同的对象,请使用
std::map
或带有std::shared_ptr
值的std::shared_ptr
对所有对象值的键插入相同的std::shared_ptr
。通过这种方式,所有键最终都将引用对象的同一实例。为什么不能执行反向操作?将“val”s附加到“k”s的向量上?使用std::tuple
或std::set
作为键怎么样?@P0W,好了,现在它完全按照您的建议在生产代码中实现。但是有点脏。我们需要不必要的for循环,例如@πάντα等ῥεῖ, 我需要通过每个键分别访问值,而不是通过一组键为什么不进行两次查找?密钥->打包密钥哈希->值?因此,您的操作符[]将执行返回valuemap[packofkeys[key]]代码>我建议不要为此使用共享ptr。共享指针是关于共享所有权的。不仅仅是传递参考资料+1为answer@sehe:密钥不在此处共享所有权吗?您建议在这种情况下使用原始指针吗?