Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有可变键计数的键值容器_C++_Boost_Containers - Fatal编程技术网

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

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:

是否有一些众所周知的容器(例如在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");
类多密钥映射
{
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:密钥不在此处共享所有权吗?您建议在这种情况下使用原始指针吗?