【问题标题】:which datastructure or stl to be used to save a pair with a value?哪个数据结构或 stl 用于保存具有值的对?
【发布时间】:2016-04-18 06:33:43
【问题描述】:

我有一个类似的数据

**"London","Paris" -> 10
"New York","Japan" -> 100
"London","Japan" -> 200**
..

如何使用 STL 保存值对?因为 Map 只允许键和值,而不是额外的键。

我可以用额外的对象保存键,该对象将保存 2 个值。

 map < string, Object>

但是我必须通过一个额外的步骤来解析对象,这将是一个开销。

即使我可以使用链表完成我的工作。但是有没有其他有效的方法来保存和访问它?或者我正在朝着正确的方向思考?我是 STL 新手。

【问题讨论】:

  • map&lt; pair&lt;std::string, std::string&gt;, int &gt; 或许
  • @M.M 对于 STL 的经验丰富的用户来说似乎是微不足道的,对于初学者来说 std::pair 具有可比性并不明显。这应该是一个答案
  • @RichardHodges 我不记得任何一个 TBH,但如果有人回答说不是,我会建议如何制作自定义比较器
  • "London","Paris" 是键,10 是值?
  • 由于您是 STL 新手,因此值得学习如何在关联容器中使用自定义键。 stackoverflow.com/questions/906244/…

标签: c++ stl


【解决方案1】:

您可以使用std::map(如 M.M. 所述)或std::pair&lt;std::string, std::string&gt;s 到ints 的std::unordered_map

std::map 很简单 - 只需使用 std::map&lt;std::pair&lt;std::string, std::string&gt;, int&gt;。标准库已经知道如何比较对。

但是,如果您不需要排序,则最好使用基于哈希的字典。借用this question,先定义这个:

struct pairhash {
public:
    template <typename T, typename U>
    std::size_t operator()(const std::pair<T, U> &x) const
    {
        return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
    }
};

(请参阅下面 Tony D 的评论以获得更好的版本。)

现在您可以使用std::unordered_map&lt;std::pair&lt;std::string, std::string&gt;, int, pairhash&gt;


请务必包含适当的标题(例如,分别为 &lt;map&gt;&lt;unordered_map&gt;)。对于无序版本,您还应该确保在 c++11 设置中构建。

【讨论】:

  • 谢谢。我认为正如 M.M 和你所回答的那样,将为我工作。我需要更多地了解 STL。但是,我得到了前进的方向。
  • std::hash&lt;T&gt;()(x.first) ^ std::hash&lt;U&gt;()(x.second); 非常容易发生冲突 - 每个 pair 都将哈希为 0,其中每个 (a, b) 将与 (b, a) 发生冲突。这些情况可能不适用于 OP 的数据,但总的来说 - 如果没有达到 boost::hash_combine - 即使是 std::hash&lt;T&gt;()(x.first) ^ (std::hash&lt;U&gt;()(x.second) &lt;&lt; 3) ^ (std::hash&lt;U&gt;()(x.second) &gt;&gt; 2); 也会好多更好。
  • @TonyD 非常感谢 - 已更新以引用您的评论。
猜你喜欢
  • 1970-01-01
  • 2017-01-24
  • 2011-03-14
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2011-05-24
  • 2016-11-25
  • 1970-01-01
相关资源
最近更新 更多