【问题标题】:C++ keys-value container with variable keys count具有可变键计数的 C++ 键值容器
【发布时间】: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::tuplestd::set 作为键怎么样?
  • @P0W,现在它完全按照您的建议在生产代码中实现。但是有点脏。例如,我们需要不必要的 for 循环等。
  • @πάντα ῥεῖ,我需要通过每个键分别访问值,而不是通过键包
  • 为什么不进行两次查找?键-> packofkeyshash-> 值?所以你的 operator[] 会做return valuemap[packofkeys[key]];

标签: c++ boost containers


【解决方案1】:

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

对于更复杂的对象,或者如果需要多个键来引用同一个不同的对象,请使用 std::mapstd::multimapstd::shared_ptr&lt;value_class&gt; 值,并为所有对象插入相同的 std::shared_ptr对象值的键。通过这种方式,所有的键最终都会引用对象的同一个实例。

【讨论】:

  • 我建议不要为此使用 shared_ptr。共享指针是关于共享所有权。不仅仅是传递参考。为答案+1
  • @sehe:这里的钥匙不共享所有权吗?你建议在这种情况下使用原始指针吗?
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多